Compare commits

..

40 Commits
v4.0 ... master

Author SHA1 Message Date
71a34e7b21
Add 'Like Sire Like Fledgling' 2024-11-24 03:18:33 +01:00
61c160ecfb
Add 'Where Worries Melt Away' 2024-11-24 01:03:00 +01:00
009b81a90d Merge pull request '[ShB][Crystalline Mean] Added final quests for both [Facet of Nourishing] and [Facet of Crafting]' (#106) from plogon_enjoyer/Questionable:crystalline-mean into master
Reviewed-on: #106
2024-11-23 23:38:35 +00:00
Plogon Enjoyer
260a9c1d30 Added the final quest for Facet of Crafting
- The Notes of Bond Restoring
2024-11-23 23:13:37 +08:00
Plogon Enjoyer
ba54a1601c Added new quest "Healing Old Wounds" 2024-11-23 22:55:09 +08:00
4d966e4353 Merge pull request '[ShB][Crystalline Mean][Facet of Nourishing] Added new quest "Where We Belong"' (#105) from plogon_enjoyer/Questionable:crystalline-mean into master
Reviewed-on: #105
2024-11-23 14:50:24 +00:00
Plogon Enjoyer
70a7d22afc Added Crystalline Mean quest for Facet of Nourishing
- Where We Belong
2024-11-23 22:25:41 +08:00
5a18813c9f Merge pull request '[ARR][Allied Society][Amalj'aa] Added new daily quest and disabled a few' (#104) from plogon_enjoyer/Questionable:amaljaa into master
Reviewed-on: #104
2024-11-23 12:40:51 +00:00
e0a7b09848 Merge pull request '[SB][Allied Society][Kojin] Updated a few daily quests' (#103) from plogon_enjoyer/Questionable:kojin into master
Reviewed-on: #103
2024-11-23 12:39:59 +00:00
238641f350 Merge pull request '[ShB][Allied Society][Qitari] Add final story quest - "Glory Be to the Scree"' (#102) from plogon_enjoyer/Questionable:qitari into master
Reviewed-on: #102
2024-11-23 12:39:05 +00:00
Plogon Enjoyer
0e71d37424 Disabled incomplete daily quests add and committed by mistake. These are all currently WIP.
- Smothering Instinct
- Forged in Flame
- Beacon Keepers
2024-11-23 19:44:44 +08:00
Plogon Enjoyer
501a2bd06d Added new daily quest: Hard to Port 2024-11-23 19:43:42 +08:00
Plogon Enjoyer
ccf077ed6b Updated a few daily quests
- A Real Pearler
- You Have the Rite
2024-11-23 18:36:49 +08:00
Plogon Enjoyer
9dfe110d38 Add final story quest - "Glory Be to the Scree" 2024-11-23 18:13:19 +08:00
92b97a7caa
Update inspection exclusion paths 2024-11-22 22:30:52 +01:00
c86f9955f7
Update dependencies 2024-11-22 22:25:06 +01:00
5da2dc9f8e
Add some Honored Pelupelu quests 2024-11-22 22:23:05 +01:00
0265fcc0ae
Remove 'Automatically complete snipe tasks' 2024-11-22 21:52:35 +01:00
73e030b620
Add 'Recruitment Drive' Pelupelu quest 2024-11-22 21:04:55 +01:00
145a989a07
Use ActorControlFlags to check item use in battles 2024-11-22 02:12:56 +01:00
6c1c66971d
Add waypoints in 'Burden of Beasts' to (hopefully) avoid combat 2024-11-21 16:26:42 +01:00
07c5faa781
Add Respected Pelupelu quests 2024-11-20 18:39:30 +01:00
c1aadb8c9c
Add 'Sanuwa Samba' Vanu Vanu quest 2024-11-20 16:29:57 +01:00
6e1ee729da
Add 'When Hunting Goes Wrong' Vath quest 2024-11-20 03:28:35 +01:00
4d397022b9
Add waypoint before Vath turn-in counter to simplify navigation for all daily quests 2024-11-20 03:28:13 +01:00
1d9198eacd
Use Lifestream for firmament teleporting 2024-11-19 19:01:53 +01:00
472aeac04a
Add missing RNG spawn in 'The Rudiments of Fiend Removal' 2024-11-19 17:15:11 +01:00
03f4c39ba8
Update Renderer utility to API 11 2024-11-19 15:57:15 +01:00
28795e68e4
Version bump, remove redundant nullability checks, minor cleanup 2024-11-18 20:56:13 +01:00
3ab1069ab7
Fix item use in 'Strange Bedfellows' and 'Combat Evolved' 2024-11-18 20:51:49 +01:00
f71ddeddfa
Add extra waypoint to attune to Dock Poga aetheryte during first pelupelu quest 2024-11-18 20:00:09 +01:00
c65da42cd1
Add 'A Present from the Present' 2024-11-18 19:35:53 +01:00
ed4d279432
Fix gathering for tribal quests 2024-11-18 19:05:22 +01:00
d4c1b4b3ac
Add 'A Labor of Leaf' 2024-11-18 19:05:12 +01:00
3b1bfcaade
Add 'Every Anden of the Rainbow' 2024-11-18 19:02:01 +01:00
0d7263604b
Updated Pelupelu quests to allow for multiple quests to be turned in at once 2024-11-18 18:21:36 +01:00
a540fd8b86
Add additional waypoint to 'Growing as a Guide' 2024-11-18 17:46:45 +01:00
993d6918ec
Add one of the missing weekly NieR quests 2024-11-18 17:46:31 +01:00
6342da8348
Version bump 2024-11-17 20:39:37 +01:00
af545ea29b
Rebuild in VS 2024-11-17 20:36:32 +01:00
89 changed files with 3392 additions and 624 deletions

View File

@ -1,5 +1,5 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<Version>4.0</Version> <Version>4.4</Version>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@ -3,16 +3,12 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Enums; using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Game.Command; using Dalamud.Game.Command;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.Gathering; using Questionable.Model.Gathering;
using Questionable.Model.Questing; using Questionable.Model.Questing;
@ -70,14 +66,14 @@ internal sealed class EditorCommands : IDisposable
if (target == null || target.ObjectKind != ObjectKind.GatheringPoint) if (target == null || target.ObjectKind != ObjectKind.GatheringPoint)
throw new Exception("No valid target"); throw new Exception("No valid target");
var gatheringPoint = _dataManager.GetExcelSheet<GatheringPoint>()!.GetRow(target.DataId); var gatheringPoint = _dataManager.GetExcelSheet<GatheringPoint>().GetRowOrDefault(target.DataId);
if (gatheringPoint == null) if (gatheringPoint == null)
throw new Exception("Invalid gathering point"); throw new Exception("Invalid gathering point");
FileInfo targetFile; FileInfo targetFile;
GatheringRoot root; GatheringRoot root;
var locationsInTerritory = _plugin.GetLocationsInTerritory(_clientState.TerritoryType).ToList(); var locationsInTerritory = _plugin.GetLocationsInTerritory(_clientState.TerritoryType).ToList();
var location = locationsInTerritory.SingleOrDefault(x => x.Id == gatheringPoint.GatheringPointBase.Row); var location = locationsInTerritory.SingleOrDefault(x => x.Id == gatheringPoint.Value.GatheringPointBase.RowId);
if (location != null) if (location != null)
{ {
targetFile = location.File; targetFile = location.File;
@ -96,7 +92,7 @@ internal sealed class EditorCommands : IDisposable
} }
else else
{ {
(targetFile, root) = CreateNewFile(gatheringPoint, target); (targetFile, root) = CreateNewFile(gatheringPoint.Value, target);
_chatGui.Print($"Creating new file under {targetFile.FullName}", "qG"); _chatGui.Print($"Creating new file under {targetFile.FullName}", "qG");
} }
@ -174,16 +170,16 @@ internal sealed class EditorCommands : IDisposable
?.File.Directory; ?.File.Directory;
if (targetFolder == null) if (targetFolder == null)
{ {
var territoryInfo = _dataManager.GetExcelSheet<TerritoryType>()!.GetRow(_clientState.TerritoryType)!; var territoryInfo = _dataManager.GetExcelSheet<TerritoryType>().GetRow(_clientState.TerritoryType);
targetFolder = _plugin.PathsDirectory targetFolder = _plugin.PathsDirectory
.CreateSubdirectory(ExpansionData.ExpansionFolders[(EExpansionVersion)territoryInfo.ExVersion.Row]) .CreateSubdirectory(ExpansionData.ExpansionFolders[(EExpansionVersion)territoryInfo.ExVersion.RowId])
.CreateSubdirectory(territoryInfo.PlaceName.Value!.Name.ToString()); .CreateSubdirectory(territoryInfo.PlaceName.Value.Name.ToString());
} }
FileInfo targetFile = FileInfo targetFile =
new FileInfo( new FileInfo(
Path.Combine(targetFolder.FullName, Path.Combine(targetFolder.FullName,
$"{gatheringPoint.GatheringPointBase.Row}_{gatheringPoint.PlaceName.Value!.Name}_{(_clientState.LocalPlayer!.ClassJob.Id == 16 ? "MIN" : "BTN")}.json")); $"{gatheringPoint.GatheringPointBase.RowId}_{gatheringPoint.PlaceName.Value.Name}_{(_clientState.LocalPlayer!.ClassJob.RowId == 16 ? "MIN" : "BTN")}.json"));
var root = new GatheringRoot var root = new GatheringRoot
{ {
Author = [_configuration.AuthorName], Author = [_configuration.AuthorName],

View File

@ -59,7 +59,7 @@ public sealed class RendererPlugin : IDalamudPlugin
_editorWindow = new EditorWindow(this, _editorCommands, dataManager, targetManager, clientState, objectTable) _editorWindow = new EditorWindow(this, _editorCommands, dataManager, targetManager, clientState, objectTable)
{ IsOpen = true }; { IsOpen = true };
_windowSystem.AddWindow(_editorWindow); _windowSystem.AddWindow(_editorWindow);
_currentClassJob = (EClassJob?)_clientState.LocalPlayer?.ClassJob.Id ?? EClassJob.Adventurer; _currentClassJob = (EClassJob?)_clientState.LocalPlayer?.ClassJob.RowId ?? EClassJob.Adventurer;
_pluginInterface.GetIpcSubscriber<object>("Questionable.ReloadData") _pluginInterface.GetIpcSubscriber<object>("Questionable.ReloadData")
.Subscribe(Reload); .Subscribe(Reload);

View File

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects;
@ -11,7 +10,7 @@ using Dalamud.Interface.Colors;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using ImGuiNET; using ImGuiNET;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
using Questionable.Model.Gathering; using Questionable.Model.Gathering;
namespace GatheringPathRenderer.Windows; namespace GatheringPathRenderer.Windows;
@ -205,12 +204,12 @@ internal sealed class EditorWindow : Window
} }
else if (_target != null) else if (_target != null)
{ {
var gatheringPoint = _dataManager.GetExcelSheet<GatheringPoint>()!.GetRow(_target.DataId); var gatheringPoint = _dataManager.GetExcelSheet<GatheringPoint>().GetRowOrDefault(_target.DataId);
if (gatheringPoint == null) if (gatheringPoint == null)
return; return;
var locationsInTerritory = _plugin.GetLocationsInTerritory(_clientState.TerritoryType).ToList(); var locationsInTerritory = _plugin.GetLocationsInTerritory(_clientState.TerritoryType).ToList();
var location = locationsInTerritory.SingleOrDefault(x => x.Id == gatheringPoint.GatheringPointBase.Row); var location = locationsInTerritory.SingleOrDefault(x => x.Id == gatheringPoint.Value.GatheringPointBase.RowId);
if (location != null) if (location != null)
{ {
var targetFile = location.File; var targetFile = location.File;
@ -234,9 +233,9 @@ internal sealed class EditorWindow : Window
} }
else else
{ {
if (ImGui.Button($"Create location ({gatheringPoint.GatheringPointBase.Row})")) if (ImGui.Button($"Create location ({gatheringPoint.Value.GatheringPointBase.RowId})"))
{ {
var (targetFile, root) = _editorCommands.CreateNewFile(gatheringPoint, _target); var (targetFile, root) = _editorCommands.CreateNewFile(gatheringPoint.Value, _target);
_plugin.Save(targetFile, root); _plugin.Save(targetFile, root);
} }
} }

View File

@ -4,9 +4,9 @@
"net8.0-windows7.0": { "net8.0-windows7.0": {
"DalamudPackager": { "DalamudPackager": {
"type": "Direct", "type": "Direct",
"requested": "[2.1.13, )", "requested": "[11.0.0, )",
"resolved": "2.1.13", "resolved": "11.0.0",
"contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA=="
}, },
"DotNet.ReproducibleBuilds": { "DotNet.ReproducibleBuilds": {
"type": "Direct", "type": "Direct",
@ -87,7 +87,7 @@
"llib": { "llib": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"DalamudPackager": "[2.1.13, )" "DalamudPackager": "[11.0.0, )"
} }
}, },
"questionable.model": { "questionable.model": {

2
LLib

@ -1 +1 @@
Subproject commit 70b0bef2459898a70f7b34b4d196bbaeb72397b1 Subproject commit 783fea977a2524dd63e717367fc026c52efe6c23

View File

@ -1,6 +1,7 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer", "Author": "plogon_enjoyer",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,

View File

@ -1,6 +1,8 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer", "Author": "plogon_enjoyer",
"Disabled": true,
"Comment": "WIP too many cases",
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -17,9 +19,118 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -175.15483,
"Y": 40,
"Z": 159.05237
},
"TerritoryId": 146,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 2003019,
"Position": {
"X": -88.059875,
"Y": 43.503418,
"Z": 149.00427
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, [4], null, null, null, null],
"Mount": true
},
{
"DataId": 2003022,
"Position": {
"X": -170.85535,
"Y": 39.993896,
"Z": 135.45422
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, [5], null, null, null, null],
"Mount": true
},
{
"DataId": 2003017,
"Position": {
"X": -97.48993,
"Y": 45.792236,
"Z": 197.28381
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, [20], null, null, null, null],
"Mount": true
},
{
"DataId": 2003020,
"Position": {
"X": -77.836365,
"Y": 43.4729,
"Z": 155.50464
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, [21], null, null, null, null],
"Mount": true
},
{
"DataId": 2003015,
"Position": {
"X": 133.62317,
"Y": 13.961914,
"Z": 152.26978
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, [36], null, null, null, null],
"Mount": true
},
{
"DataId": 2003018,
"Position": {
"X": -100.572266,
"Y": 45.76172,
"Z": 211.04749
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, [37], null, null, null, null],
"Mount": true
},
{
"DataId": 2003016,
"Position": {
"X": 185.19873,
"Y": 13.992493,
"Z": 231.89136
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, [52, 53], null, null, null, null],
"Mount": true
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 30.256956,
"Y": 38.639523,
"Z": 145.03891
},
"TerritoryId": 146,
"InteractionType": "WalkTo",
"Mount": true
},
{ {
"DataId": 1005551, "DataId": 1005551,
"Position": { "Position": {

View File

@ -1,6 +1,7 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer", "Author": "plogon_enjoyer",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,

View File

@ -0,0 +1,213 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1005551,
"Position": {
"X": 98.924194,
"Y": 15.29447,
"Z": -349.4469
},
"TerritoryId": 146,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1005745,
"Position": {
"X": 22.720581,
"Y": 4.240738,
"Z": -443.07623
},
"TerritoryId": 146,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -126.48953,
"Y": 27.57419,
"Z": 138.61473
},
"TerritoryId": 146,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 2003048,
"Position": {
"X": -136.85822,
"Y": 18.753235,
"Z": 116.50256
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [1, 2], null, null, null],
"Mount": true
},
{
"DataId": 2003049,
"Position": {
"X": -121.78229,
"Y": 28.732666,
"Z": 140.33716
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [3], null, null, null],
"Mount": true
},
{
"DataId": 2003050,
"Position": {
"X": -91.96619,
"Y": 43.07617,
"Z": 156.84741
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [4], null, null, null],
"Mount": true
},
{
"DataId": 2003051,
"Position": {
"X": -55.40558,
"Y": 42.526855,
"Z": 192.18738
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [1, 3, 4], null, null, null],
"Mount": true
},
{
"DataId": 2003052,
"Position": {
"X": 6.668152,
"Y": 36.9115,
"Z": 207.01917
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [2], null, null, null],
"Mount": true
},
{
"DataId": 2003053,
"Position": {
"X": 73.31958,
"Y": 31.784546,
"Z": 153.76514
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [1], null, null, null],
"Mount": true
},
{
"DataId": 2003054,
"Position": {
"X": 79.42322,
"Y": 25.802979,
"Z": 208.66711
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [2, 4], null, null, null],
"Mount": true
},
{
"DataId": 2003055,
"Position": {
"X": 106.889404,
"Y": 14.602844,
"Z": 147.53943
},
"TerritoryId": 146,
"InteractionType": "Interact",
"RequiredQuestVariables": [null, null, [3], null, null, null],
"Mount": true
},
{
"Position": {
"X": 135.42383,
"Y": 8.102478,
"Z": 178.36267
},
"TerritoryId": 146,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [2456],
"Mount": true
},
{
"DataId": 2003056,
"Position": {
"X": 135.42383,
"Y": 8.102478,
"Z": 178.36267
},
"TerritoryId": 146,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -63.849556,
"Y": 26.409807,
"Z": -383.9894
},
"TerritoryId": 146,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Southern Thanalan - Little Ala Mhigo",
"Mount": true
},
{
"DataId": 1005745,
"Position": {
"X": 22.720581,
"Y": 4.240738,
"Z": -443.07623
},
"TerritoryId": 146,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1005551,
"Position": {
"X": 98.924194,
"Y": 15.29447,
"Z": -349.4469
},
"TerritoryId": 146,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,37 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1011030,
"Position": {
"X": 7.522644,
"Y": -1.7667189E-06,
"Z": -68.589294
},
"TerritoryId": 388,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1010472,
"Position": {
"X": -53.26935,
"Y": 0.3093315,
"Z": 69.41321
},
"TerritoryId": 148,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
}
]
}
]
}

View File

@ -0,0 +1,118 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016093,
"Position": {
"X": -776.0281,
"Y": -133.35559,
"Z": -414.32825
},
"TerritoryId": 401,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016219,
"Position": {
"X": 14.389221,
"Y": -111.05486,
"Z": 413.71777
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1016217,
"Position": {
"X": 97.48987,
"Y": -86.45681,
"Z": 466.57495
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1016218,
"Position": {
"X": 137.95679,
"Y": -87.380325,
"Z": 434.62268
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true,
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu"
}
]
}
]
}

View File

@ -62,6 +62,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -70,8 +80,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true
} }
] ]
} }

View File

@ -58,6 +58,16 @@
{ {
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -66,8 +76,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "Interact", "InteractionType": "Interact"
"Fly": true
} }
] ]
}, },
@ -102,6 +111,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -110,8 +129,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true
} }
] ]
} }

View File

@ -98,6 +98,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -106,9 +117,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
} }

View File

@ -62,6 +62,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -70,9 +81,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
} }

View File

@ -91,6 +91,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -99,9 +110,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
} }

View File

@ -91,6 +91,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -99,9 +110,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
} }

View File

@ -73,6 +73,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -81,9 +92,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
} }

View File

@ -58,6 +58,17 @@
{ {
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -66,9 +77,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "Interact", "InteractionType": "Interact"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
}, },

View File

@ -88,14 +88,13 @@
"Steps": [ "Steps": [
{ {
"Position": { "Position": {
"X": 59.511234, "X": 58.39701,
"Y": -48, "Y": -48.000008,
"Z": -171.35385 "Z": -172.36507
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true, "Fly": true,
"Land": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine" "AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}, },
{ {

View File

@ -148,14 +148,14 @@
"Steps": [ "Steps": [
{ {
"Position": { "Position": {
"X": 59.511234, "X": 58.39701,
"Y": -48, "Y": -48.000008,
"Z": -171.35385 "Z": -172.36507
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true, "Fly": true,
"Land": true "AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}, },
{ {
"DataId": 1016803, "DataId": 1016803,

View File

@ -78,6 +78,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -86,9 +97,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
} }

View File

@ -55,6 +55,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -63,8 +73,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true
} }
] ]
} }

View File

@ -91,6 +91,17 @@
{ {
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -99,9 +110,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "Interact", "InteractionType": "Interact"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
}, },

View File

@ -0,0 +1,125 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016865,
"Position": {
"X": -272.23627,
"Y": -35.408485,
"Z": 219.07373
},
"TerritoryId": 398,
"InteractionType": "Interact",
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1016864,
"Position": {
"X": -452.32324,
"Y": -35.352047,
"Z": 174.30371
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016866,
"Position": {
"X": -397.05505,
"Y": -34.192406,
"Z": 243.12195
},
"TerritoryId": 398,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
5551
],
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1016866,
"Position": {
"X": -397.05505,
"Y": -34.192406,
"Z": 243.12195
},
"TerritoryId": 398,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -101,6 +101,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -109,8 +119,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true
} }
] ]
} }

View File

@ -100,6 +100,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -108,8 +118,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true
} }
] ]
} }

View File

@ -73,6 +73,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -81,9 +92,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
} }
] ]
} }

View File

@ -101,6 +101,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 58.39701,
"Y": -48.000008,
"Z": -172.36507
},
"TerritoryId": 398,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1016803, "DataId": 1016803,
"Position": { "Position": {
@ -109,8 +119,7 @@
"Z": -174.63953 "Z": -174.63953
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest"
"Fly": true
} }
] ]
} }

View File

@ -22,9 +22,9 @@
"Steps": [ "Steps": [
{ {
"Position": { "Position": {
"X": 291.9449, "X": 318.06195,
"Y": -62.62814, "Y": -83.027016,
"Z": -214.1033 "Z": -226.5931
}, },
"TerritoryId": 613, "TerritoryId": 613,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
@ -153,16 +153,6 @@
{ {
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{
"Position": {
"X": 804.21405,
"Y": 1.4000988,
"Z": 720.92487
},
"TerritoryId": 613,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1024460, "DataId": 1024460,
"Position": { "Position": {
@ -172,6 +162,11 @@
}, },
"TerritoryId": 613, "TerritoryId": 613,
"InteractionType": "Interact", "InteractionType": "Interact",
"AetheryteShortcut": "Kugane",
"AethernetShortcut": [
"[Kugane] Aetheryte Plaza",
"[Kugane] The Ruby Price"
],
"Fly": true "Fly": true
} }
] ]
@ -187,8 +182,8 @@
}, },
"TerritoryId": 613, "TerritoryId": 613,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true, "AetheryteShortcut": "Ruby Sea - Tamamizu",
"AetheryteShortcut": "Ruby Sea - Tamamizu" "Fly": true
}, },
{ {
"DataId": 1024217, "DataId": 1024217,

View File

@ -28,6 +28,7 @@
}, },
"TerritoryId": 613, "TerritoryId": 613,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"RestartNavigationIfCancelled": false,
"Fly": true "Fly": true
}, },
{ {
@ -38,6 +39,7 @@
}, },
"TerritoryId": 613, "TerritoryId": 613,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"RestartNavigationIfCancelled": false,
"Fly": true "Fly": true
}, },
{ {
@ -58,9 +60,9 @@
"Steps": [ "Steps": [
{ {
"Position": { "Position": {
"X": 368.39856, "X": 367.17773,
"Y": -116.624695, "Y": -119.94679,
"Z": -291.34058 "Z": -292.3781
}, },
"TerritoryId": 613, "TerritoryId": 613,
"InteractionType": "UseItem", "InteractionType": "UseItem",

View File

@ -0,0 +1,103 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1032659,
"Position": {
"X": 802.79236,
"Y": -45.91779,
"Z": -218.58557
},
"TerritoryId": 817,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1027716,
"Position": {
"X": 494.9873,
"Y": -6.555339,
"Z": -224.93329
},
"TerritoryId": 817,
"InteractionType": "Interact",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1032732,
"Position": {
"X": -26.93219,
"Y": -24.638563,
"Z": 319.35608
},
"TerritoryId": 817,
"InteractionType": "Interact",
"AetheryteShortcut": "Rak'tika - Slitherbough",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1032750,
"Position": {
"X": -523.827,
"Y": 0.143766,
"Z": 227.55774
},
"TerritoryId": 817,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1032750,
"Position": {
"X": -523.827,
"Y": 0.143766,
"Z": 227.55774
},
"TerritoryId": 817,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1032660,
"Position": {
"X": 804.4098,
"Y": -45.9255,
"Z": -216.41876
},
"TerritoryId": 817,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,117 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1027234,
"Position": {
"X": 10.2387085,
"Y": 20.185999,
"Z": -138.2315
},
"TerritoryId": 819,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1028326,
"Position": {
"X": 10.940674,
"Y": 20.186,
"Z": -142.53455
},
"TerritoryId": 819,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Prompt": "TEXT_LUCKLA203_03232_Q1_000_000",
"Type": "List",
"Answer": "TEXT_LUCKLA203_03232_A1_000_001"
}
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"TerritoryId": 819,
"InteractionType": "Craft",
"ItemId": 27247,
"ItemCount": 1
},
{
"DataId": 1027234,
"Position": {
"X": 10.2387085,
"Y": 20.185999,
"Z": -138.2315
},
"TerritoryId": 819,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1028438,
"Position": {
"X": -55.832825,
"Y": 3.9998174,
"Z": 198.6571
},
"TerritoryId": 819,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Crystarium] The Crystalline Mean",
"[Crystarium] Musica Universalis Markets"
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1028438,
"Position": {
"X": -55.832825,
"Y": 3.9998174,
"Z": 198.6571
},
"TerritoryId": 819,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1027234,
"Position": {
"X": 10.2387085,
"Y": 20.185999,
"Z": -138.2315
},
"TerritoryId": 819,
"InteractionType": "CompleteQuest",
"AethernetShortcut": [
"[Crystarium] Musica Universalis Markets",
"[Crystarium] The Crystalline Mean"
]
}
]
}
]
}

View File

@ -0,0 +1,133 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1027235,
"Position": {
"X": -19.516357,
"Y": 20.186,
"Z": -130.1748
},
"TerritoryId": 819,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1028484,
"Position": {
"X": -129.35083,
"Y": 0,
"Z": -62.912964
},
"TerritoryId": 819,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Crystarium] The Crystalline Mean",
"[Crystarium] Temenos Rookery"
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1028484,
"Position": {
"X": -129.35083,
"Y": 0,
"Z": -62.912964
},
"TerritoryId": 819,
"InteractionType": "Say",
"ChatMessage": {
"Key": "TEXT_LUCKLA302_03234_SAYTODO_000_013"
}
}
]
},
{
"Sequence": 3,
"Steps": [
{
"TerritoryId": 819,
"InteractionType": "Craft",
"ItemId": 27253,
"ItemCount": 1
},
{
"DataId": 1030659,
"Position": {
"X": -131.15137,
"Y": 0,
"Z": -65.53754
},
"TerritoryId": 819,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1028485,
"Position": {
"X": -492.3934,
"Y": 69.70277,
"Z": 570.18384
},
"TerritoryId": 816,
"InteractionType": "Interact",
"AetheryteShortcut": "Il Mheg - Lydha Lran",
"Fly": true
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1028487,
"Position": {
"X": 337.84998,
"Y": 87.30014,
"Z": -710.65845
},
"TerritoryId": 816,
"InteractionType": "Interact",
"AetheryteShortcut": "Il Mheg - Wolekdorf",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1027235,
"Position": {
"X": -19.516357,
"Y": 20.186,
"Z": -130.1748
},
"TerritoryId": 819,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Crystarium",
"AethernetShortcut": [
"[Crystarium] Aetheryte Plaza",
"[Crystarium] The Crystalline Mean"
]
}
]
}
]
}

View File

@ -0,0 +1,131 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1027235,
"Position": {
"X": -19.516357,
"Y": 20.186,
"Z": -130.1748
},
"TerritoryId": 819,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1030659,
"Position": {
"X": -131.15137,
"Y": 0,
"Z": -65.53754
},
"TerritoryId": 819,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Crystarium] The Crystalline Mean",
"[Crystarium] Temenos Rookery"
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"TerritoryId": 819,
"InteractionType": "Craft",
"ItemId": 27255,
"ItemCount": 1
},
{
"DataId": 1030659,
"Position": {
"X": -131.15137,
"Y": 0,
"Z": -65.53754
},
"TerritoryId": 819,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1028489,
"Position": {
"X": 355.42847,
"Y": 3.8289368,
"Z": 224.17017
},
"TerritoryId": 813,
"InteractionType": "Interact",
"AetheryteShortcut": "Lakeland - Fort Jobb",
"Fly": true
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1028491,
"Position": {
"X": 29.251465,
"Y": 36.20521,
"Z": -207.38544
},
"TerritoryId": 819,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1030659,
"Position": {
"X": -131.15137,
"Y": 0,
"Z": -65.53754
},
"TerritoryId": 819,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Crystarium] The Amaro Launch",
"[Crystarium] Temenos Rookery"
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1027235,
"Position": {
"X": -19.516357,
"Y": 20.186,
"Z": -130.1748
},
"TerritoryId": 819,
"InteractionType": "CompleteQuest",
"AethernetShortcut": [
"[Crystarium] Temenos Rookery",
"[Crystarium] The Crystalline Mean"
]
}
]
}
]
}

View File

@ -0,0 +1,70 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1036044,
"Position": {
"X": 652.7046,
"Y": 297.47797,
"Z": -171.03839
},
"TerritoryId": 814,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Kholusia - Tomra",
"Fly": true,
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_LUCKTA523_04052_Q1_000_000",
"Answer": "TEXT_LUCKTA523_04052_A1_000_001"
}
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 552.4747,
"Y": 294.7846,
"Z": -137.54712
},
"TerritoryId": 814,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"KillEnemyDataIds": [
10391
],
"CombatItemUse": {
"ItemId": 2003071,
"Condition": "Health%",
"Value": 30
},
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1036044,
"Position": {
"X": 652.7046,
"Y": 297.47797,
"Z": -171.03839
},
"TerritoryId": 814,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,84 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1044547,
"Position": {
"X": -241.68768,
"Y": 51.058994,
"Z": 620.8744
},
"TerritoryId": 816,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Il Mheg - Lydha Lran",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
},
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_SUBCTS681_04716_Q1_000_003",
"Answer": "TEXT_SUBCTS681_04716_A1_000_001"
}
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1044560,
"Position": {
"X": -241.68768,
"Y": 51.058994,
"Z": 620.8744
},
"TerritoryId": 816,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2013247,
"Position": {
"X": 428.15283,
"Y": 3.2196045,
"Z": 23.483582
},
"TerritoryId": 817,
"InteractionType": "Interact",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1044560,
"Position": {
"X": -241.68768,
"Y": 51.058994,
"Z": 620.8744
},
"TerritoryId": 816,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Il Mheg - Lydha Lran",
"Fly": true,
"NextQuestId": 4717
}
]
}
]
}

View File

@ -0,0 +1,44 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1044550,
"Position": {
"X": -239.70398,
"Y": 51.05899,
"Z": 622.2477
},
"StopDistance": 5,
"TerritoryId": 816,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Il Mheg - Lydha Lran",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1044562,
"Position": {
"X": -294.97223,
"Y": 67.46317,
"Z": 603.6621
},
"TerritoryId": 816,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -21,6 +21,17 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": 807.9048,
"Y": 152.2857,
"Z": -243.60707
},
"TerritoryId": 961,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Elpis - Anagnorisis",
"Fly": true
},
{ {
"DataId": 2012293, "DataId": 2012293,
"Position": { "Position": {
@ -30,8 +41,6 @@
}, },
"TerritoryId": 961, "TerritoryId": 961,
"InteractionType": "Interact", "InteractionType": "Interact",
"AetheryteShortcut": "Elpis - Anagnorisis",
"Fly": true,
"TargetTerritoryId": 1025 "TargetTerritoryId": 1025
}, },
{ {
@ -120,7 +129,8 @@
"Z": 301.9912 "Z": 301.9912
}, },
"TerritoryId": 956, "TerritoryId": 956,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest",
"NextQuestId": 5252
} }
] ]
} }

View File

@ -0,0 +1,126 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048609,
"Position": {
"X": -10.696594,
"Y": 2.4000525,
"Z": -31.174255
},
"TerritoryId": 962,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Old Sharlayan",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1045332,
"Position": {
"X": -639.704,
"Y": -27.177149,
"Z": 301.9912
},
"TerritoryId": 956,
"InteractionType": "Interact",
"AetheryteShortcut": "Labyrinthos - Aporia"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 807.9048,
"Y": 152.2857,
"Z": -243.60707
},
"TerritoryId": 961,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Elpis - Anagnorisis",
"Fly": true
},
{
"DataId": 2012293,
"Position": {
"X": 809.9336,
"Y": 151.81189,
"Z": -243.42719
},
"TerritoryId": 961,
"InteractionType": "Interact",
"TargetTerritoryId": 1025
},
{
"DataId": 1048610,
"Position": {
"X": 93.94971,
"Y": -1E-11,
"Z": 61.020752
},
"TerritoryId": 1025,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2014542,
"Position": {
"X": 104.57007,
"Y": -0.015319824,
"Z": 46.25
},
"TerritoryId": 1025,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1048610,
"Position": {
"X": 93.94971,
"Y": -1E-11,
"Z": 61.020752
},
"TerritoryId": 1025,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1045332,
"Position": {
"X": -639.704,
"Y": -27.177149,
"Z": 301.9912
},
"TerritoryId": 956,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Labyrinthos - Aporia"
}
]
}
]
}

View File

@ -0,0 +1,62 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1037575,
"Position": {
"X": 6.454529,
"Y": -31.530432,
"Z": -78.14148
},
"TerritoryId": 956,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 379.89767,
"Y": 68.15723,
"Z": -169.26231
},
"TerritoryId": 956,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"KillEnemyDataIds": [
13415
],
"CombatItemUse": {
"ItemId": 2003316,
"Condition": "Health%",
"Value": 50
},
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1037575,
"Position": {
"X": 6.454529,
"Y": -31.530432,
"Z": -78.14148
},
"TerritoryId": 956,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Labyrinthos - Sharlayan Hamlet",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,123 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1044156,
"Position": {
"X": -276.3562,
"Y": 39.993896,
"Z": 224.26172
},
"TerritoryId": 1055,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2013553,
"Position": {
"X": -389.82227,
"Y": 3.250122,
"Z": 238.02539
},
"TerritoryId": 1055,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1046221,
"Position": {
"X": -303.12048,
"Y": 39.993896,
"Z": 244.80042
},
"TerritoryId": 1055,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1046279,
"Position": {
"X": -147.17328,
"Y": 48.330666,
"Z": 164.38538
},
"TerritoryId": 1055,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1046281,
"Position": {
"X": -118.21167,
"Y": 91.550545,
"Z": 398.79456
},
"TerritoryId": 1055,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1046221,
"Position": {
"X": -303.12048,
"Y": 39.993896,
"Z": 244.80042
},
"TerritoryId": 1055,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1046284,
"Position": {
"X": -402.2431,
"Y": 1.7196094,
"Z": 226.4591
},
"StopDistance": 5,
"TerritoryId": 1055,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -53,7 +53,21 @@
null, null,
null, null,
null null
] ],
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
}, },
{ {
"DataId": 2014481, "DataId": 2014481,

View File

@ -39,7 +39,21 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Interact", "InteractionType": "Interact",
"Fly": true "Fly": true,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
} }
] ]
}, },

View File

@ -48,7 +48,21 @@
null, null,
null, null,
64 64
] ],
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
}, },
{ {
"DataId": 2014485, "DataId": 2014485,
@ -101,7 +115,21 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true "Fly": true,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
}, },
{ {
"DataId": 1051711, "DataId": 1051711,

View File

@ -39,7 +39,21 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Interact", "InteractionType": "Interact",
"Fly": true "Fly": true,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
} }
] ]
}, },
@ -62,6 +76,42 @@
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [
{
"Position": {
"X": 548.1944,
"Y": 6.15866,
"Z": -196.99664
},
"TerritoryId": 1188,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": 610.0975,
"Y": 7.8043165,
"Z": -228.70596
},
"TerritoryId": 1188,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": 680.4834,
"Y": 10.053757,
"Z": -263.73697
},
"TerritoryId": 1188,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": 743.98376,
"Y": 9.793373,
"Z": -263.45914
},
"TerritoryId": 1188,
"InteractionType": "WalkTo"
},
{ {
"DataId": 1052306, "DataId": 1052306,
"Position": { "Position": {
@ -85,7 +135,21 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true "Fly": true,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
}, },
{ {
"DataId": 1051711, "DataId": 1051711,

View File

@ -31,9 +31,20 @@
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{ {
"Position": {
"X": -165.49648,
"Y": 8.736965,
"Z": -401.72836
},
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "None", "InteractionType": "WalkTo",
"AetheryteShortcut": "Kozama'uka - Ok'hanu" "AetheryteShortcut": "Kozama'uka - Ok'hanu",
"Fly": true,
"SkipConditions": {
"StepIf": {
"Flying": "Locked"
}
}
}, },
{ {
"DataId": 1052307, "DataId": 1052307,

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Comment": "TODO untested how many RNG states this has",
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -40,7 +39,21 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Interact", "InteractionType": "Interact",
"Fly": true "Fly": true,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
} }
] ]
}, },
@ -98,6 +111,32 @@
null, null,
null null
] ]
},
{
"DataId": 2014490,
"Position": {
"X": 485.6183,
"Y": 10.8185425,
"Z": -281.7884
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
18173
],
"RequiredQuestVariables": [
null,
null,
[
{
"High": 3
}
],
null,
null,
null
]
} }
] ]
}, },

View File

@ -47,7 +47,21 @@
null, null,
null, null,
128 128
] ],
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
}, },
{ {
"DataId": 2014495, "DataId": 2014495,

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -28,6 +27,93 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014497,
"Position": {
"X": -130.7851,
"Y": 114.39685,
"Z": 240.31421
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
18174
],
"AetheryteShortcut": "Kozama'uka - Earthenshire",
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 1
}
],
null,
null,
null
]
},
{
"DataId": 2014498,
"Position": {
"X": -56.565247,
"Y": 111.77234,
"Z": 172.62524
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
18174
],
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 2
}
],
null,
null,
null
]
},
{
"DataId": 2014499,
"Position": {
"X": -84.18408,
"Y": 111.436646,
"Z": 268.05518
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
18174
],
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 3
}
],
null,
null,
null
]
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -28,6 +27,74 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"DataId": 1052324,
"Position": {
"X": -248.18805,
"Y": 110.17465,
"Z": 189.01343
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Earthenshire",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1052326,
"Position": {
"X": -304.61584,
"Y": 110.20639,
"Z": 725.39856
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"RequiredQuestVariables": [
null,
[
{
"High": 2
}
],
null,
null,
null,
null
]
},
{
"DataId": 1052435,
"Position": {
"X": 505.76025,
"Y": 115.10293,
"Z": 205.7373
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires",
"RequiredQuestVariables": [
null,
[
{
"High": 1
}
],
null,
null,
null,
null
]
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -28,6 +27,99 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051798,
"Position": {
"X": 897.734,
"Y": 6.8223433,
"Z": -285.1759
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1052328,
"Position": {
"X": 171.6792,
"Y": 16.762953,
"Z": -112.44379
},
"TerritoryId": 1188,
"InteractionType": "Action",
"Action": "Bosom Brook",
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 1
}
],
null,
null,
null
]
},
{
"DataId": 1052329,
"Position": {
"X": 216.7544,
"Y": 16.31888,
"Z": -99.687195
},
"TerritoryId": 1188,
"InteractionType": "Action",
"Action": "Bosom Brook",
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 2
}
],
null,
null,
null
]
},
{
"DataId": 1052327,
"Position": {
"X": 186.38892,
"Y": 21.742897,
"Z": -74.47931
},
"TerritoryId": 1188,
"InteractionType": "Action",
"Action": "Bosom Brook",
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 3
}
],
null,
null,
null
]
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [

View File

@ -38,7 +38,21 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true "Fly": true,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
}, },
{ {
"DataId": 1052331, "DataId": 1052331,

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -28,6 +27,84 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"DataId": 1052333,
"Position": {
"X": 775.1736,
"Y": 12.871736,
"Z": -196.0022
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1052335,
"Position": {
"X": 867.76526,
"Y": 14.402381,
"Z": -171.31305
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1052334,
"Position": {
"X": 864.5609,
"Y": 15.056413,
"Z": -256.27533
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1052336,
"Position": {
"X": 838.4375,
"Y": 14.301746,
"Z": -222.06458
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
@ -39,7 +116,7 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Kozama'uka - Dock Poga" "Fly": true
}, },
{ {
"DataId": 1051711, "DataId": 1051711,

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -28,6 +27,62 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 746.76465,
"Y": 15.431515,
"Z": -201.92921
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
},
{
"DataId": 1051741,
"Position": {
"X": 744.19763,
"Y": 15.431515,
"Z": -199.17603
},
"StopDistance": 7,
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1052341,
"Position": {
"X": 239.49023,
"Y": 111.689354,
"Z": 699.3667
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires",
"Fly": true
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -28,6 +27,109 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014508,
"Position": {
"X": 566.1554,
"Y": 123.552246,
"Z": 700.4043
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
18177
],
"AetheryteShortcut": "Kozama'uka - Many Fires",
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 1
}
],
null,
null,
null
]
},
{
"DataId": 2014509,
"Position": {
"X": 557.94604,
"Y": 124.65088,
"Z": 778.56104
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
18177
],
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 2
}
],
null,
null,
null
]
},
{
"DataId": 2014507,
"Position": {
"X": 721.8584,
"Y": 123.09448,
"Z": 729.9762
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
18177
],
"Fly": true,
"RequiredQuestVariables": [
null,
null,
[
{
"High": 3
}
],
null,
null,
null
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1052443,
"Position": {
"X": 641.8097,
"Y": 122.10785,
"Z": 730.70874
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [

View File

@ -1,7 +1,6 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza", "Author": "liza",
"Disabled": true,
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -28,6 +27,96 @@
} }
] ]
}, },
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014511,
"Position": {
"X": 226.85583,
"Y": 2.9450073,
"Z": -199.6643
},
"StopDistance": 1,
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2014510,
"Position": {
"X": 218.1582,
"Y": 2.2124634,
"Z": -184.92413
},
"StopDistance": 1,
"TerritoryId": 1188,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014512,
"Position": {
"X": 61.53955,
"Y": 8.102478,
"Z": -230.79272
},
"StopDistance": 1,
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 746.76465,
"Y": 15.431515,
"Z": -201.92921
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Kozama'uka - Dock Poga"
},
{
"DataId": 1051741,
"Position": {
"X": 744.19763,
"Y": 15.431515,
"Z": -199.17603
},
"StopDistance": 7,
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
@ -39,7 +128,21 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Kozama'uka - Dock Poga" "Fly": true,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": 770.7179,
"Y": 12.84657,
"Z": -263.99634
},
"TerritoryId": 1188,
"MaximumDistance": 300
}
}
}
}, },
{ {
"DataId": 1051711, "DataId": 1051711,

View File

@ -163,6 +163,21 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 780.3438,
"Y": 13.823656,
"Z": -238.32625
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Fly": true,
"SkipConditions": {
"StepIf": {
"AetheryteUnlocked": "Kozama'uka - Dock Poga"
}
}
},
{ {
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "AttuneAetheryte", "InteractionType": "AttuneAetheryte",

View File

@ -0,0 +1,171 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"Position": {
"X": 809.655,
"Y": 17.004526,
"Z": -257.89868
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"Fly": true,
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
},
{
"DataId": 1051710,
"Position": {
"X": 822.629,
"Y": 17.102613,
"Z": -263.20288
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051733,
"Position": {
"X": 553.06323,
"Y": 115.84422,
"Z": 173.32715
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires"
},
{
"DataId": 1051734,
"Position": {
"X": 588.7998,
"Y": 116.71518,
"Z": 216.84595
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 1051735,
"Position": {
"X": 614.9232,
"Y": 119.49004,
"Z": 172.16748
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051736,
"Position": {
"X": 573.3883,
"Y": 116,
"Z": 202.62451
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2014432,
"Position": {
"X": 663.569,
"Y": 117.50964,
"Z": 647.9437
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051738,
"Position": {
"X": 661.7991,
"Y": 117.68325,
"Z": 646.6925
},
"StopDistance": 5,
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1051739,
"Position": {
"X": 410.39136,
"Y": 122.23778,
"Z": 797.5432
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 6,
"Steps": [
{
"DataId": 1051738,
"Position": {
"X": 661.7991,
"Y": 117.68325,
"Z": 646.6925
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051710,
"Position": {
"X": 822.629,
"Y": 17.102613,
"Z": -263.20288
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Dock Poga"
}
]
}
]
}

View File

@ -965,7 +965,8 @@
"Katon", "Katon",
"Raiton", "Raiton",
"Hide", "Hide",
"Slug Shot" "Slug Shot",
"Bosom Brook"
] ]
} }
}, },

View File

@ -41,5 +41,6 @@ public sealed class ActionConverter() : EnumConverter<EAction>(Values)
{ EAction.Katon, "Katon" }, { EAction.Katon, "Katon" },
{ EAction.Raiton, "Raiton" }, { EAction.Raiton, "Raiton" },
{ EAction.SlugShot, "Slug Shot" }, { EAction.SlugShot, "Slug Shot" },
{ EAction.BosomBrook, "Bosom Brook" },
}; };
} }

View File

@ -47,6 +47,7 @@ public enum EAction
Raiton = 2267, Raiton = 2267,
RabbitMedium = 2272, RabbitMedium = 2272,
SlugShot = 7412, SlugShot = 7412,
BosomBrook = 37173,
CollectMiner = 240, CollectMiner = 240,
ScourMiner = 22182, ScourMiner = 22182,
@ -84,6 +85,7 @@ public static class EActionExtensions
or EAction.YellowGulal or EAction.YellowGulal
or EAction.BlueGulal or EAction.BlueGulal
or EAction.ElectrixFlux or EAction.ElectrixFlux
or EAction.HopStep; or EAction.HopStep
or EAction.BosomBrook;
} }
} }

View File

@ -1,5 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=vendor_005CECommons/@EntryIndexedValue">ExplicitlyExcluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=vendor/@EntryIndexedValue">ExplicitlyExcluded</s:String>
<s:Boolean x:Key="/Default/Environment/AutoImport2/=CSHARP/BlackLists/=Newtonsoft_002E_002A/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/AutoImport2/=CSHARP/BlackLists/=Newtonsoft_002E_002A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=aporia/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=aporia/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=arcadion/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=arcadion/@EntryIndexedValue">True</s:Boolean>

View File

@ -7,7 +7,7 @@ namespace Questionable;
internal sealed class Configuration : IPluginConfiguration internal sealed class Configuration : IPluginConfiguration
{ {
public const int PluginSetupVersion = 1; public const int PluginSetupVersion = 2;
public int Version { get; set; } =1 ; public int Version { get; set; } =1 ;
public int PluginSetupCompleteVersion { get; set; } public int PluginSetupCompleteVersion { get; set; }
@ -28,7 +28,6 @@ internal sealed class Configuration : IPluginConfiguration
public bool HideInAllInstances { get; set; } = true; public bool HideInAllInstances { get; set; } = true;
public bool UseEscToCancelQuesting { get; set; } = true; public bool UseEscToCancelQuesting { get; set; } = true;
public bool ShowIncompleteSeasonalEvents { get; set; } = true; public bool ShowIncompleteSeasonalEvents { get; set; } = true;
public bool AutomaticallyCompleteSnipeTasks { get; set; }
public bool ConfigureTextAdvance { get; set; } = true; public bool ConfigureTextAdvance { get; set; } = true;
} }

View File

@ -142,8 +142,7 @@ internal sealed class ItemUseModule : ICombatModule
{ {
BattleChara* battleChara = (BattleChara*)gameObject.Address; BattleChara* battleChara = (BattleChara*)gameObject.Address;
if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.Incapacitated) if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.Incapacitated)
//return (byte)(((nint)battleChara + 0x1C68) & 0x40) != 0; // FIXME 7.1 return (battleChara->ActorControlFlags & 0x40) != 0;
return false;
if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.HealthPercent) if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.HealthPercent)
return (100f * battleChara->Health / battleChara->MaxHealth) < _combatData.CombatItemUse.Value; return (100f * battleChara->Health / battleChara->MaxHealth) < _combatData.CombatItemUse.Value;

View File

@ -98,7 +98,6 @@ internal sealed class InteractionUiController : IDisposable
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "HousingSelectBlock", HousingSelectBlockPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "HousingSelectBlock", HousingSelectBlockPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "TelepotTown", TeleportTownPostSetup);
unsafe unsafe
{ {
@ -756,12 +755,12 @@ internal sealed class InteractionUiController : IDisposable
private bool TryFindWarp(ushort targetTerritoryId, string actualPrompt, [NotNullWhen(true)] out uint? warpId, private bool TryFindWarp(ushort targetTerritoryId, string actualPrompt, [NotNullWhen(true)] out uint? warpId,
[NotNullWhen(true)] out string? warpText) [NotNullWhen(true)] out string? warpText)
{ {
var warps = _dataManager.GetExcelSheet<Warp>()! var warps = _dataManager.GetExcelSheet<Warp>()
.Where(x => x.RowId > 0 && x.TerritoryType.RowId == targetTerritoryId); .Where(x => x.RowId > 0 && x.TerritoryType.RowId == targetTerritoryId);
foreach (var entry in warps) foreach (var entry in warps)
{ {
string? excelName = entry.Name.ToString(); string excelName = entry.Name.ToString();
string? excelQuestion = entry.Question.ToString(); string excelQuestion = entry.Question.ToString();
if (!string.IsNullOrEmpty(excelQuestion) && GameFunctions.GameStringEquals(excelQuestion, actualPrompt)) if (!string.IsNullOrEmpty(excelQuestion) && GameFunctions.GameStringEquals(excelQuestion, actualPrompt))
{ {
@ -848,46 +847,6 @@ internal sealed class InteractionUiController : IDisposable
addon->FireCallbackInt(0); addon->FireCallbackInt(0);
} }
private void TeleportTownPostSetup(AddonEvent type, AddonArgs args)
{
if (ShouldHandleUiInteractions &&
_questController.HasCurrentTaskMatching(out AethernetShortcut.Task? aethernetShortcut) &&
aethernetShortcut.From.IsFirmamentAetheryte())
{
// this might be better via atkvalues; but this works for now
uint toIndex = aethernetShortcut.To switch
{
EAetheryteLocation.FirmamentMendicantsCourt => 0,
EAetheryteLocation.FirmamentMattock => 1,
EAetheryteLocation.FirmamentNewNest => 2,
EAetheryteLocation.FirmanentSaintRoellesDais => 3,
EAetheryteLocation.FirmamentFeatherfall => 4,
EAetheryteLocation.FirmamentHoarfrostHall => 5,
EAetheryteLocation.FirmamentWesternRisensongQuarter => 6,
EAetheryteLocation.FIrmamentEasternRisensongQuarter => 7,
_ => uint.MaxValue,
};
if (toIndex == uint.MaxValue)
return;
_logger.LogInformation("Teleporting to {ToName} with menu index {ToIndex}", aethernetShortcut.From,
toIndex);
unsafe
{
var teleportToDestination = stackalloc AtkValue[]
{
new() { Type = ValueType.Int, Int = 11 },
new() { Type = ValueType.UInt, UInt = toIndex }
};
var addon = (AtkUnitBase*)args.Addon;
addon->FireCallback(2, teleportToDestination);
addon->FireCallback(2, teleportToDestination, true);
}
}
}
private StringOrRegex? ResolveReference(Quest? quest, string? excelSheet, ExcelRef? excelRef, bool isRegExp) private StringOrRegex? ResolveReference(Quest? quest, string? excelSheet, ExcelRef? excelRef, bool isRegExp)
{ {
if (excelRef == null) if (excelRef == null)
@ -905,7 +864,6 @@ internal sealed class InteractionUiController : IDisposable
public void Dispose() public void Dispose()
{ {
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "TelepotTown", TeleportTownPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "HousingSelectBlock", HousingSelectBlockPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "HousingSelectBlock", HousingSelectBlockPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);

View File

@ -120,11 +120,15 @@ internal abstract class MiniTaskController<T>
return; return;
case ETaskResult.TaskComplete: case ETaskResult.TaskComplete:
case ETaskResult.CreateNewTasks:
_logger.LogInformation("{Task} → {Result}, remaining tasks: {RemainingTaskCount}", _logger.LogInformation("{Task} → {Result}, remaining tasks: {RemainingTaskCount}",
_taskQueue.CurrentTaskExecutor.CurrentTask, result, _taskQueue.RemainingTasks.Count()); _taskQueue.CurrentTaskExecutor.CurrentTask, result, _taskQueue.RemainingTasks.Count());
OnTaskComplete(_taskQueue.CurrentTaskExecutor.CurrentTask); OnTaskComplete(_taskQueue.CurrentTaskExecutor.CurrentTask);
if (result == ETaskResult.CreateNewTasks && _taskQueue.CurrentTaskExecutor is IExtraTaskCreator extraTaskCreator)
_taskQueue.EnqueueAll(extraTaskCreator.CreateExtraTasks());
_taskQueue.CurrentTaskExecutor = null; _taskQueue.CurrentTaskExecutor = null;
// handled in next update // handled in next update

View File

@ -12,14 +12,14 @@ namespace Questionable.Controller.Steps.Common;
internal static class SendNotification internal static class SendNotification
{ {
internal sealed class Factory( internal sealed class Factory(
Configuration configuration, AutomatonIpc automatonIpc,
TerritoryData territoryData) : SimpleTaskFactory TerritoryData territoryData) : SimpleTaskFactory
{ {
public override ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step) public override ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
{ {
return step.InteractionType switch return step.InteractionType switch
{ {
EInteractionType.Snipe when !configuration.General.AutomaticallyCompleteSnipeTasks => EInteractionType.Snipe when !automatonIpc.IsAutoSnipeEnabled =>
new Task(step.InteractionType, step.Comment), new Task(step.InteractionType, step.Comment),
EInteractionType.Duty => EInteractionType.Duty =>
new Task(step.InteractionType, step.ContentFinderConditionId.HasValue new Task(step.InteractionType, step.ContentFinderConditionId.HasValue

View File

@ -11,6 +11,11 @@ internal enum ETaskResult
/// </summary> /// </summary>
SkipRemainingTasksForStep, SkipRemainingTasksForStep,
/// <summary>
/// Assumes the task executor implements <see cref="IExtraTaskCreator"/>.
/// </summary>
CreateNewTasks,
NextStep, NextStep,
End, End,
} }

View File

@ -8,6 +8,7 @@ using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
using Questionable.Controller.Utils; using Questionable.Controller.Utils;
using Questionable.External;
using Questionable.Functions; using Questionable.Functions;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.Questing; using Questionable.Model.Questing;
@ -16,7 +17,7 @@ namespace Questionable.Controller.Steps.Interactions;
internal static class Interact internal static class Interact
{ {
internal sealed class Factory(Configuration configuration) : ITaskFactory internal sealed class Factory(AutomatonIpc automatonIpc) : ITaskFactory
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{ {
@ -43,7 +44,7 @@ internal static class Interact
} }
else if (step.InteractionType == EInteractionType.Snipe) else if (step.InteractionType == EInteractionType.Snipe)
{ {
if (!configuration.General.AutomaticallyCompleteSnipeTasks) if (!automatonIpc.IsAutoSnipeEnabled)
yield break; yield break;
} }
else if (step.InteractionType != EInteractionType.Interact) else if (step.InteractionType != EInteractionType.Interact)

View File

@ -204,19 +204,11 @@ internal static class AethernetShortcut
} }
private void DoTeleport() private void DoTeleport()
{
if (Task.From.IsFirmamentAetheryte())
{
logger.LogInformation("Using manual teleport interaction");
_teleported = gameFunctions.InteractWith((uint)Task.From, ObjectKind.EventObj);
}
else
{ {
logger.LogInformation("Using lifestream to teleport to {Destination}", Task.To); logger.LogInformation("Using lifestream to teleport to {Destination}", Task.To);
lifestreamIpc.Teleport(Task.To); lifestreamIpc.Teleport(Task.To);
_teleported = true; _teleported = true;
} }
}
public override ETaskResult Update() public override ETaskResult Update()
{ {

View File

@ -4,7 +4,6 @@ using System.Linq;
using Dalamud.Game.Text; using Dalamud.Game.Text;
using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game;
using LLib.GameData; using LLib.GameData;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -19,14 +18,7 @@ namespace Questionable.Controller.Steps.Shared;
internal static class Gather internal static class Gather
{ {
internal sealed class Factory( internal sealed class Factory : ITaskFactory
IServiceProvider serviceProvider,
MovementController movementController,
GatheringPointRegistry gatheringPointRegistry,
IClientState clientState,
GatheringData gatheringData,
TerritoryData territoryData,
ILogger<Factory> logger) : ITaskFactory
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{ {
@ -34,17 +26,42 @@ internal static class Gather
yield break; yield break;
foreach (var itemToGather in step.ItemsToGather) foreach (var itemToGather in step.ItemsToGather)
{
yield return new DelayedGatheringTask(itemToGather, quest);
}
}
}
internal sealed record DelayedGatheringTask(GatheredItem GatheredItem, Quest Quest) : ITask
{
public override string ToString() => $"Gathering(pending for {GatheredItem.ItemId})";
}
internal sealed class DelayedGatheringExecutor(
MovementController movementController,
GatheringData gatheringData,
GatheringPointRegistry gatheringPointRegistry,
TerritoryData territoryData,
IClientState clientState,
IServiceProvider serviceProvider,
ILogger<DelayedGatheringExecutor> logger) : TaskExecutor<DelayedGatheringTask>, IExtraTaskCreator
{
protected override bool Start() => true;
public override ETaskResult Update() => ETaskResult.CreateNewTasks;
public IEnumerable<ITask> CreateExtraTasks()
{ {
EClassJob currentClassJob = (EClassJob)clientState.LocalPlayer!.ClassJob.RowId; EClassJob currentClassJob = (EClassJob)clientState.LocalPlayer!.ClassJob.RowId;
if (!gatheringData.TryGetGatheringPointId(itemToGather.ItemId, currentClassJob, if (!gatheringData.TryGetGatheringPointId(Task.GatheredItem.ItemId, currentClassJob,
out GatheringPointId? gatheringPointId)) out GatheringPointId? gatheringPointId))
throw new TaskException($"No gathering point found for item {itemToGather.ItemId}"); throw new TaskException($"No gathering point found for item {Task.GatheredItem.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}");
if (HasRequiredItems(itemToGather)) if (HasRequiredItems(Task.GatheredItem))
continue; yield break;
using (var _ = logger.BeginScope("Gathering(inner)")) using (var _ = logger.BeginScope("Gathering(inner)"))
{ {
@ -56,7 +73,7 @@ internal static class Gather
foreach (var gatheringStep in gatheringSequence.Steps) foreach (var gatheringStep in gatheringSequence.Steps)
{ {
foreach (var task in serviceProvider.GetRequiredService<TaskCreator>() foreach (var task in serviceProvider.GetRequiredService<TaskCreator>()
.CreateTasks(quest, gatheringSequence, gatheringStep)) .CreateTasks(Task.Quest, gatheringSequence, gatheringStep))
if (task is WaitAtEnd.NextStep) if (task is WaitAtEnd.NextStep)
yield return new SkipMarker(); yield return new SkipMarker();
else else
@ -71,10 +88,9 @@ internal static class Gather
yield return new WaitCondition.Task(() => movementController.IsNavmeshReady, yield return new WaitCondition.Task(() => movementController.IsNavmeshReady,
"Wait(navmesh ready)"); "Wait(navmesh ready)");
yield return new GatheringTask(gatheringPointId, itemToGather); yield return new GatheringTask(gatheringPointId, Task.GatheredItem);
yield return new WaitAtEnd.WaitDelay(); yield return new WaitAtEnd.WaitDelay();
} }
}
private unsafe bool HasRequiredItems(GatheredItem itemToGather) private unsafe bool HasRequiredItems(GatheredItem itemToGather)
{ {

View File

@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using Questionable.Model;
namespace Questionable.Controller.Steps; namespace Questionable.Controller.Steps;
@ -16,6 +18,11 @@ internal interface ITaskExecutor
ETaskResult Update(); ETaskResult Update();
} }
internal interface IExtraTaskCreator : ITaskExecutor
{
IEnumerable<ITask> CreateExtraTasks();
}
internal abstract class TaskExecutor<T> : ITaskExecutor internal abstract class TaskExecutor<T> : ITaskExecutor
where T : class, ITask where T : class, ITask
{ {

View File

@ -18,6 +18,11 @@ internal sealed class TaskQueue
_tasks.Add(task); _tasks.Add(task);
} }
public void EnqueueAll(IEnumerable<ITask> tasks)
{
_tasks.InsertRange(0, tasks);
}
public bool TryDequeue([NotNullWhen(true)] out ITask? task) public bool TryDequeue([NotNullWhen(true)] out ITask? task)
{ {
task = _tasks.FirstOrDefault(); task = _tasks.FirstOrDefault();

View File

@ -1,48 +0,0 @@
using System;
using Dalamud.Hooking;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Event;
using FFXIVClientStructs.FFXIV.Common.Lua;
namespace Questionable.Controller.Utils;
internal sealed unsafe class AutoSnipeHandler : IDisposable
{
private readonly QuestController _questController;
private readonly Configuration _configuration;
private readonly Hook<EnqueueSnipeTaskDelegate> _enqueueSnipeTaskHook;
private delegate ulong EnqueueSnipeTaskDelegate(EventSceneModuleImplBase* scene, lua_State* state);
public AutoSnipeHandler(QuestController questController, Configuration configuration, IGameInteropProvider gameInteropProvider)
{
_questController = questController;
_configuration = configuration;
_enqueueSnipeTaskHook =
gameInteropProvider.HookFromSignature<EnqueueSnipeTaskDelegate>(
"48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 57 48 83 EC 50 48 8B F1 48 8D 4C 24 ?? E8 ?? ?? ?? ?? 48 8B 4C 24 ??",
EnqueueSnipeTask);
}
public void Enable() => _enqueueSnipeTaskHook.Enable();
private ulong EnqueueSnipeTask(EventSceneModuleImplBase* scene, lua_State* state)
{
if (_configuration.General.AutomaticallyCompleteSnipeTasks && _questController.IsRunning)
{
var val = state->top;
val->tt = 3;
val->value.n = 1;
state->top += 1;
return 1;
}
else
return _enqueueSnipeTaskHook.Original.Invoke(scene, state);
}
public void Dispose()
{
_enqueueSnipeTaskHook.Dispose();
}
}

View File

@ -11,7 +11,7 @@ internal sealed class AetherCurrentData
public AetherCurrentData(IDataManager dataManager) public AetherCurrentData(IDataManager dataManager)
{ {
_overworldCurrents = dataManager.GetExcelSheet<AetherCurrentCompFlgSet>()! _overworldCurrents = dataManager.GetExcelSheet<AetherCurrentCompFlgSet>()
.Where(x => x.RowId > 0) .Where(x => x.RowId > 0)
.Where(x => x.Territory.IsValid) .Where(x => x.Territory.IsValid)
.ToImmutableDictionary( .ToImmutableDictionary(

View File

@ -40,7 +40,7 @@ internal sealed class QuestData
public QuestData(IDataManager dataManager) public QuestData(IDataManager dataManager)
{ {
Dictionary<uint, uint> questChapters = Dictionary<uint, uint> questChapters =
dataManager.GetExcelSheet<QuestChapter>()! dataManager.GetExcelSheet<QuestChapter>()
.Where(x => x.RowId > 0 && x.Quest.RowId > 0) .Where(x => x.RowId > 0 && x.Quest.RowId > 0)
.ToDictionary(x => x.Quest.RowId, x => x.Redo.RowId); .ToDictionary(x => x.Quest.RowId, x => x.Redo.RowId);

40
Questionable/External/AutomatonIpc.cs vendored Normal file
View File

@ -0,0 +1,40 @@
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using Dalamud.Plugin.Ipc.Exceptions;
using Microsoft.Extensions.Logging;
namespace Questionable.External;
internal sealed class AutomatonIpc
{
private readonly ILogger<AutomatonIpc> _logger;
private readonly ICallGateSubscriber<string,bool> _isTweakEnabled;
private bool _loggedIpcError;
public AutomatonIpc(IDalamudPluginInterface pluginInterface, ILogger<AutomatonIpc> logger)
{
_logger = logger;
_isTweakEnabled = pluginInterface.GetIpcSubscriber<string, bool>("Automaton.IsTweakEnabled");
logger.LogWarning("Automaton x {IsTweakEnabled}", IsAutoSnipeEnabled);
}
public bool IsAutoSnipeEnabled
{
get
{
try
{
return _isTweakEnabled.InvokeFunc("AutoSnipeQuests");
}
catch (IpcError e)
{
if (!_loggedIpcError)
{
_loggedIpcError = true;
_logger.LogWarning(e, "Could not query automaton for tweak status, probably not installed");
}
return false;
}
}
}
}

View File

@ -1,5 +1,9 @@
using Dalamud.Plugin; using System.Collections.Generic;
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Ipc;
using Dalamud.Plugin.Services;
using Lumina.Excel.Sheets;
using Microsoft.Extensions.Logging;
using Questionable.Data; using Questionable.Data;
using Questionable.Model.Common; using Questionable.Model.Common;
@ -8,25 +12,40 @@ namespace Questionable.External;
internal sealed class LifestreamIpc internal sealed class LifestreamIpc
{ {
private readonly AetheryteData _aetheryteData; private readonly AetheryteData _aetheryteData;
private readonly IDataManager _dataManager;
private readonly ILogger<LifestreamIpc> _logger;
private readonly ICallGateSubscriber<string, bool> _aethernetTeleport; private readonly ICallGateSubscriber<string, bool> _aethernetTeleport;
public LifestreamIpc(IDalamudPluginInterface pluginInterface, AetheryteData aetheryteData) public LifestreamIpc(IDalamudPluginInterface pluginInterface, AetheryteData aetheryteData, IDataManager dataManager, ILogger<LifestreamIpc> logger)
{ {
_aetheryteData = aetheryteData; _aetheryteData = aetheryteData;
_dataManager = dataManager;
_logger = logger;
_aethernetTeleport = pluginInterface.GetIpcSubscriber<string, bool>("Lifestream.AethernetTeleport"); _aethernetTeleport = pluginInterface.GetIpcSubscriber<string, bool>("Lifestream.AethernetTeleport");
} }
public bool Teleport(EAetheryteLocation aetheryteLocation) public bool Teleport(EAetheryteLocation aetheryteLocation)
{ {
if (aetheryteLocation == EAetheryteLocation.IshgardFirmament) string? name = aetheryteLocation switch
{ {
// TODO does this even work on non-EN clients? EAetheryteLocation.IshgardFirmament => "Firmament",
return _aethernetTeleport.InvokeFunc("Firmament"); EAetheryteLocation.FirmamentMendicantsCourt => GetPlaceName(3436),
} EAetheryteLocation.FirmamentMattock => GetPlaceName(3473),
EAetheryteLocation.FirmamentNewNest => GetPlaceName(3475),
EAetheryteLocation.FirmanentSaintRoellesDais => GetPlaceName(3474),
EAetheryteLocation.FirmamentFeatherfall => GetPlaceName(3525),
EAetheryteLocation.FirmamentHoarfrostHall => GetPlaceName(3528),
EAetheryteLocation.FirmamentWesternRisensongQuarter => GetPlaceName(3646),
EAetheryteLocation.FIrmamentEasternRisensongQuarter => GetPlaceName(3645),
_ => _aetheryteData.AethernetNames.GetValueOrDefault(aetheryteLocation),
};
if (!_aetheryteData.AethernetNames.TryGetValue(aetheryteLocation, out string? name)) if (name == null)
return false; return false;
_logger.LogInformation("Teleporting to '{Name}'", name);
return _aethernetTeleport.InvokeFunc(name); return _aethernetTeleport.InvokeFunc(name);
} }
private string GetPlaceName(uint rowId) => _dataManager.GetExcelSheet<PlaceName>().GetRow(rowId).Name.ToString();
} }

View File

@ -46,7 +46,7 @@ internal sealed unsafe class ChatFunctions
.Where(x => x.TextCommand.IsValid) .Where(x => x.TextCommand.IsValid)
.Select(x => (x.RowId, Command: x.TextCommand.Value.Command.ToString())) .Select(x => (x.RowId, Command: x.TextCommand.Value.Command.ToString()))
.Where(x => !string.IsNullOrEmpty(x.Command) && x.Command.StartsWith('/')) .Where(x => !string.IsNullOrEmpty(x.Command) && x.Command.StartsWith('/'))
.ToDictionary(x => (EEmote)x.RowId, x => x.Command!) .ToDictionary(x => (EEmote)x.RowId, x => x.Command)
.AsReadOnly(); .AsReadOnly();
} }

View File

@ -122,29 +122,45 @@ internal sealed unsafe class QuestFunctions
// do the MSQ; if a side quest is the first item do that side quest. // do the MSQ; if a side quest is the first item do that side quest.
// //
// If no quests are marked as 'priority', accepting a new quest adds it to the top of the list. // If no quests are marked as 'priority', accepting a new quest adds it to the top of the list.
List<(ElementId Quest, byte Sequence)> trackedQuests = [];
for (int i = questManager->TrackedQuests.Length - 1; i >= 0; --i) for (int i = questManager->TrackedQuests.Length - 1; i >= 0; --i)
{ {
ElementId currentQuest; ElementId currentQuest;
var trackedQuest = questManager->TrackedQuests[i]; var trackedQuest = questManager->TrackedQuests[i];
switch (trackedQuest.QuestType) switch (trackedQuest.QuestType)
{ {
default:
continue;
case 1: // normal quest case 1: // normal quest
currentQuest = new QuestId(questManager->NormalQuests[trackedQuest.Index].QuestId); currentQuest = new QuestId(questManager->NormalQuests[trackedQuest.Index].QuestId);
if (_questRegistry.IsKnownQuest(currentQuest)) if (_questRegistry.IsKnownQuest(currentQuest))
return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value)); trackedQuests.Add((currentQuest, QuestManager.GetQuestSequence(currentQuest.Value)));
continue; break;
case 2: // leve case 2: // leve
currentQuest = new LeveId(questManager->LeveQuests[trackedQuest.Index].LeveId); currentQuest = new LeveId(questManager->LeveQuests[trackedQuest.Index].LeveId);
if (_questRegistry.IsKnownQuest(currentQuest)) if (_questRegistry.IsKnownQuest(currentQuest))
return (currentQuest, questManager->GetLeveQuestById(currentQuest.Value)->Sequence); trackedQuests.Add((currentQuest, questManager->GetLeveQuestById(currentQuest.Value)->Sequence));
continue; break;
} }
} }
if (trackedQuests.Count > 0)
{
// if we have multiple quests to turn in for an allied society, try and complete all of them
var (firstTrackedQuest, firstTrackedSequence) = trackedQuests.First();
EAlliedSociety firstTrackedAlliedSociety = GetCommonAlliedSocietyTurnIn(firstTrackedQuest);
if (firstTrackedAlliedSociety != EAlliedSociety.None && firstTrackedSequence == 255)
{
foreach (var (quest, sequence) in trackedQuests.Skip(1))
{
// only if the other quest isn't ready to be turned in
if (GetCommonAlliedSocietyTurnIn(quest) == firstTrackedAlliedSociety && sequence != 255)
return (quest, sequence);
}
}
return (firstTrackedQuest, firstTrackedSequence);
}
ElementId? priorityQuest = GetNextPriorityQuestThatCanBeAccepted(); ElementId? priorityQuest = GetNextPriorityQuestThatCanBeAccepted();
if (priorityQuest != null) if (priorityQuest != null)
{ {
@ -221,6 +237,21 @@ internal sealed unsafe class QuestFunctions
return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value)); return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value));
} }
private static EAlliedSociety GetCommonAlliedSocietyTurnIn(ElementId elementId)
{
if (elementId is QuestId questId)
{
return questId.Value switch
{
5215 => EAlliedSociety.None,
>= 5199 and <= 5226 => EAlliedSociety.Pelupelu,
_ => EAlliedSociety.None,
};
}
return EAlliedSociety.None;
}
public QuestProgressInfo? GetQuestProgressInfo(ElementId elementId) public QuestProgressInfo? GetQuestProgressInfo(ElementId elementId)
{ {
if (elementId is QuestId questId) if (elementId is QuestId questId)
@ -596,7 +627,7 @@ internal sealed unsafe class QuestFunctions
public bool IsClassJobUnlocked(EClassJob classJob) public bool IsClassJobUnlocked(EClassJob classJob)
{ {
var classJobRow = _dataManager.GetExcelSheet<ClassJob>()!.GetRow((uint)classJob)!; var classJobRow = _dataManager.GetExcelSheet<ClassJob>().GetRow((uint)classJob);
var questId = (ushort)classJobRow.UnlockQuest.RowId; var questId = (ushort)classJobRow.UnlockQuest.RowId;
if (questId != 0) if (questId != 0)
return IsQuestComplete(new QuestId(questId)); return IsQuestComplete(new QuestId(questId));
@ -607,7 +638,7 @@ internal sealed unsafe class QuestFunctions
public bool IsJobUnlocked(EClassJob classJob) public bool IsJobUnlocked(EClassJob classJob)
{ {
var classJobRow = _dataManager.GetExcelSheet<ClassJob>()!.GetRow((uint)classJob)!; var classJobRow = _dataManager.GetExcelSheet<ClassJob>().GetRow((uint)classJob);
return IsClassJobUnlocked((EClassJob)classJobRow.ClassJobParent.RowId); return IsClassJobUnlocked((EClassJob)classJobRow.ClassJobParent.RowId);
} }

View File

@ -15,7 +15,7 @@ internal sealed class SatisfactionSupplyInfo : IQuestInfo
IssuerDataId = npc.Npc.RowId; IssuerDataId = npc.Npc.RowId;
Level = npc.LevelUnlock; Level = npc.LevelUnlock;
SortKey = QuestId.Value; SortKey = QuestId.Value;
Expansion = (EExpansionVersion)npc.QuestRequired.Value!.Expansion.RowId; Expansion = (EExpansionVersion)npc.QuestRequired.Value.Expansion.RowId;
PreviousQuests = [new PreviousQuestInfo(new QuestId((ushort)(npc.QuestRequired.RowId & 0xFFFF)))]; PreviousQuests = [new PreviousQuestInfo(new QuestId((ushort)(npc.QuestRequired.RowId & 0xFFFF)))];
} }

View File

@ -112,7 +112,6 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton<ChatFunctions>(); serviceCollection.AddSingleton<ChatFunctions>();
serviceCollection.AddSingleton<QuestFunctions>(); serviceCollection.AddSingleton<QuestFunctions>();
serviceCollection.AddSingleton<DalamudReflector>(); serviceCollection.AddSingleton<DalamudReflector>();
serviceCollection.AddSingleton<AutoSnipeHandler>();
serviceCollection.AddSingleton<AetherCurrentData>(); serviceCollection.AddSingleton<AetherCurrentData>();
serviceCollection.AddSingleton<AetheryteData>(); serviceCollection.AddSingleton<AetheryteData>();
@ -128,6 +127,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton<QuestionableIpc>(); serviceCollection.AddSingleton<QuestionableIpc>();
serviceCollection.AddSingleton<TextAdvanceIpc>(); serviceCollection.AddSingleton<TextAdvanceIpc>();
serviceCollection.AddSingleton<NotificationMasterIpc>(); serviceCollection.AddSingleton<NotificationMasterIpc>();
serviceCollection.AddSingleton<AutomatonIpc>();
} }
private static void AddTaskFactories(ServiceCollection serviceCollection) private static void AddTaskFactories(ServiceCollection serviceCollection)
@ -147,7 +147,6 @@ public sealed class QuestionablePlugin : IDalamudPlugin
.AddTaskFactoryAndExecutor<StepDisabled.SkipRemainingTasks, StepDisabled.Factory, .AddTaskFactoryAndExecutor<StepDisabled.SkipRemainingTasks, StepDisabled.Factory,
StepDisabled.SkipDisabledStepsExecutor>(); StepDisabled.SkipDisabledStepsExecutor>();
serviceCollection.AddTaskFactory<EquipRecommended.BeforeDutyOrInstance>(); serviceCollection.AddTaskFactory<EquipRecommended.BeforeDutyOrInstance>();
serviceCollection.AddTaskFactoryAndExecutor<Gather.GatheringTask, Gather.Factory, Gather.StartGathering>();
serviceCollection.AddTaskExecutor<Gather.SkipMarker, Gather.DoSkip>(); serviceCollection.AddTaskExecutor<Gather.SkipMarker, Gather.DoSkip>();
serviceCollection serviceCollection
.AddTaskFactoryAndExecutor<AetheryteShortcut.Task, AetheryteShortcut.Factory, .AddTaskFactoryAndExecutor<AetheryteShortcut.Task, AetheryteShortcut.Factory,
@ -156,6 +155,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
.AddTaskExecutor<AetheryteShortcut.MoveAwayFromAetheryte, AetheryteShortcut.MoveAwayFromAetheryteExecutor>(); .AddTaskExecutor<AetheryteShortcut.MoveAwayFromAetheryte, AetheryteShortcut.MoveAwayFromAetheryteExecutor>();
serviceCollection serviceCollection
.AddTaskFactoryAndExecutor<SkipCondition.SkipTask, SkipCondition.Factory, SkipCondition.CheckSkip>(); .AddTaskFactoryAndExecutor<SkipCondition.SkipTask, SkipCondition.Factory, SkipCondition.CheckSkip>();
serviceCollection.AddTaskFactoryAndExecutor<Gather.GatheringTask, Gather.Factory, Gather.StartGathering>();
serviceCollection.AddTaskExecutor<Gather.DelayedGatheringTask, Gather.DelayedGatheringExecutor>();
serviceCollection serviceCollection
.AddTaskFactoryAndExecutor<AethernetShortcut.Task, AethernetShortcut.Factory, .AddTaskFactoryAndExecutor<AethernetShortcut.Task, AethernetShortcut.Factory,
AethernetShortcut.UseAethernetShortcut>(); AethernetShortcut.UseAethernetShortcut>();
@ -299,8 +300,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceProvider.GetRequiredService<ShopController>(); serviceProvider.GetRequiredService<ShopController>();
serviceProvider.GetRequiredService<QuestionableIpc>(); serviceProvider.GetRequiredService<QuestionableIpc>();
serviceProvider.GetRequiredService<DalamudInitializer>(); serviceProvider.GetRequiredService<DalamudInitializer>();
serviceProvider.GetRequiredService<AutoSnipeHandler>().Enable();
serviceProvider.GetRequiredService<TextAdvanceIpc>(); serviceProvider.GetRequiredService<TextAdvanceIpc>();
serviceProvider.GetRequiredService<AutomatonIpc>();
} }
public void Dispose() public void Dispose()

View File

@ -115,18 +115,6 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
_configuration.General.ConfigureTextAdvance = configureTextAdvance; _configuration.General.ConfigureTextAdvance = configureTextAdvance;
Save(); Save();
} }
if (ImGui.CollapsingHeader("Cheats"))
{
ImGui.TextColored(ImGuiColors.DalamudRed,
"This setting will be removed in a future version, and will be\navailable through TextAdvance instead.");
bool automaticallyCompleteSnipeTasks = _configuration.General.AutomaticallyCompleteSnipeTasks;
if (ImGui.Checkbox("Automatically complete snipe tasks", ref automaticallyCompleteSnipeTasks))
{
_configuration.General.AutomaticallyCompleteSnipeTasks = automaticallyCompleteSnipeTasks;
Save();
}
}
} }
private void DrawNotificationsTab() private void DrawNotificationsTab()

View File

@ -108,9 +108,9 @@ internal sealed class GatheringJournalComponent
.GroupBy(x => x.GatheringPointId) .GroupBy(x => x.GatheringPointId)
.ToDictionary(x => x.Key, x => x.First()); .ToDictionary(x => x.Key, x => x.First());
var itemSheet = dataManager.GetExcelSheet<Item>()!; var itemSheet = dataManager.GetExcelSheet<Item>();
_gatheringItems = dataManager.GetExcelSheet<GatheringItem>()! _gatheringItems = dataManager.GetExcelSheet<GatheringItem>()
.Where(x => x.RowId != 0 && x.GatheringItemLevel.RowId != 0) .Where(x => x.RowId != 0 && x.GatheringItemLevel.RowId != 0)
.Select(x => new .Select(x => new
{ {
@ -120,7 +120,7 @@ internal sealed class GatheringJournalComponent
.Where(x => !string.IsNullOrEmpty(x.Name)) .Where(x => !string.IsNullOrEmpty(x.Name))
.ToDictionary(x => x.GatheringItemId, x => x.Name!); .ToDictionary(x => x.GatheringItemId, x => x.Name!);
_gatheringPointsByExpansion = dataManager.GetExcelSheet<GatheringPoint>()! _gatheringPointsByExpansion = dataManager.GetExcelSheet<GatheringPoint>()
.Where(x => x.GatheringPointBase.RowId != 0) .Where(x => x.GatheringPointBase.RowId != 0)
.Where(x => x.GatheringPointBase.RowId is < 653 or > 680) // exclude ishgard restoration phase 1 .Where(x => x.GatheringPointBase.RowId is < 653 or > 680) // exclude ishgard restoration phase 1
.DistinctBy(x => x.GatheringPointBase.RowId) .DistinctBy(x => x.GatheringPointBase.RowId)
@ -128,7 +128,7 @@ internal sealed class GatheringJournalComponent
{ {
GatheringPointId = x.RowId, GatheringPointId = x.RowId,
Point = new DefaultGatheringPoint(new GatheringPointId((ushort)x.GatheringPointBase.RowId), Point = new DefaultGatheringPoint(new GatheringPointId((ushort)x.GatheringPointBase.RowId),
x.GatheringPointBase.Value!.GatheringType.RowId switch x.GatheringPointBase.Value.GatheringType.RowId switch
{ {
0 or 1 => EClassJob.Miner, 0 or 1 => EClassJob.Miner,
2 or 3 => EClassJob.Botanist, 2 or 3 => EClassJob.Botanist,
@ -159,7 +159,7 @@ internal sealed class GatheringJournalComponent
_gatheringPointRegistry.TryGetGatheringPoint(x.Point.Id, out GatheringRoot? gatheringRoot)) _gatheringPointRegistry.TryGetGatheringPoint(x.Point.Id, out GatheringRoot? gatheringRoot))
{ {
// for some reason the game doesn't know where this gathering location is // for some reason the game doesn't know where this gathering location is
var territoryType = territoryTypeSheet.GetRow(gatheringRoot.Steps.Last().TerritoryId)!; var territoryType = territoryTypeSheet.GetRow(gatheringRoot.Steps.Last().TerritoryId);
return x.Point with return x.Point with
{ {
Expansion = (EExpansionVersion)territoryType.ExVersion.RowId, Expansion = (EExpansionVersion)territoryType.ExVersion.RowId,

View File

@ -10,10 +10,11 @@ using ImGuiNET;
using LLib; using LLib;
using LLib.ImGui; using LLib.ImGui;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.External;
namespace Questionable.Windows; namespace Questionable.Windows;
internal sealed class OneTimeSetupWindow : LWindow, IDisposable internal sealed class OneTimeSetupWindow : LWindow
{ {
private static readonly IReadOnlyList<PluginInfo> RequiredPlugins = private static readonly IReadOnlyList<PluginInfo> RequiredPlugins =
[ [
@ -22,35 +23,24 @@ internal sealed class OneTimeSetupWindow : LWindow, IDisposable
vnavmesh handles the navigation within a zone, moving vnavmesh handles the navigation within a zone, moving
your character to the next quest-related objective. your character to the next quest-related objective.
""", """,
new Uri("https://github.com/awgil/ffxiv_navmesh/")), new Uri("https://github.com/awgil/ffxiv_navmesh/"),
new Uri("https://puni.sh/api/repository/veyn")),
new("Lifestream", new("Lifestream",
""" """
Used to travel to aethernet shards in cities. Used to travel to aethernet shards in cities.
""", """,
new Uri("https://github.com/NightmareXIV/Lifestream")), new Uri("https://github.com/NightmareXIV/Lifestream"),
new Uri("https://github.com/NightmareXIV/MyDalamudPlugins/raw/main/pluginmaster.json")),
new("TextAdvance", new("TextAdvance",
""" """
Automatically accepts and turns in quests, skips cutscenes Automatically accepts and turns in quests, skips cutscenes
and dialogue. and dialogue.
""", """,
new Uri("https://github.com/NightmareXIV/TextAdvance")), new Uri("https://github.com/NightmareXIV/TextAdvance"),
new Uri("https://github.com/NightmareXIV/MyDalamudPlugins/raw/main/pluginmaster.json")),
]; ];
private static readonly IReadOnlyList<PluginInfo> RecommendedPlugins = private readonly IReadOnlyList<PluginInfo> _recommendedPlugins;
[
new("Rotation Solver Reborn",
"""
Automatically handles most combat interactions you encounter
during quests, including being interrupted by mobs.
""",
new Uri("https://github.com/FFXIV-CombatReborn/RotationSolverReborn")),
new("NotificationMaster",
"""
Sends a configurable out-of-game notification if a quest
requires manual actions.
""",
new Uri("https://github.com/NightmareXIV/NotificationMaster")),
];
private readonly Configuration _configuration; private readonly Configuration _configuration;
private readonly IDalamudPluginInterface _pluginInterface; private readonly IDalamudPluginInterface _pluginInterface;
@ -59,7 +49,7 @@ internal sealed class OneTimeSetupWindow : LWindow, IDisposable
private readonly ILogger<OneTimeSetupWindow> _logger; private readonly ILogger<OneTimeSetupWindow> _logger;
public OneTimeSetupWindow(Configuration configuration, IDalamudPluginInterface pluginInterface, UiUtils uiUtils, public OneTimeSetupWindow(Configuration configuration, IDalamudPluginInterface pluginInterface, UiUtils uiUtils,
DalamudReflector dalamudReflector, ILogger<OneTimeSetupWindow> logger) DalamudReflector dalamudReflector, ILogger<OneTimeSetupWindow> logger, AutomatonIpc automatonIpc)
: base("Questionable Setup###QuestionableOneTimeSetup", : base("Questionable Setup###QuestionableOneTimeSetup",
ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoSavedSettings, true) ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoSavedSettings, true)
{ {
@ -69,6 +59,33 @@ internal sealed class OneTimeSetupWindow : LWindow, IDisposable
_dalamudReflector = dalamudReflector; _dalamudReflector = dalamudReflector;
_logger = logger; _logger = logger;
_recommendedPlugins =
[
new("Rotation Solver Reborn",
"""
Automatically handles most combat interactions you encounter
during quests, including being interrupted by mobs.
""",
new Uri("https://github.com/FFXIV-CombatReborn/RotationSolverReborn"),
new Uri(
"https://raw.githubusercontent.com/FFXIV-CombatReborn/CombatRebornRepo/main/pluginmaster.json")),
new PluginInfo("Automaton",
"""
Automaton is a collection of automation-related tweaks.
The 'Sniper no sniping' tweak can complete snipe tasks automatically.
""",
new Uri("https://github.com/Jaksuhn/Automaton"),
new Uri("https://puni.sh/api/repository/croizat"),
[new PluginDetailInfo("'Sniper no sniping' enabled", () => automatonIpc.IsAutoSnipeEnabled)]),
new("NotificationMaster",
"""
Sends a configurable out-of-game notification if a quest
requires manual actions.
""",
new Uri("https://github.com/NightmareXIV/NotificationMaster"),
null),
];
RespectCloseHotkey = false; RespectCloseHotkey = false;
ShowCloseButton = false; ShowCloseButton = false;
AllowPinning = false; AllowPinning = false;
@ -101,7 +118,7 @@ internal sealed class OneTimeSetupWindow : LWindow, IDisposable
ImGui.Text("The following plugins are recommended, but not required:"); ImGui.Text("The following plugins are recommended, but not required:");
using (ImRaii.PushIndent()) using (ImRaii.PushIndent())
{ {
foreach (var plugin in RecommendedPlugins) foreach (var plugin in _recommendedPlugins)
DrawPlugin(plugin, checklistPadding); DrawPlugin(plugin, checklistPadding);
} }
@ -149,8 +166,28 @@ internal sealed class OneTimeSetupWindow : LWindow, IDisposable
using (ImRaii.PushIndent(checklistPadding)) using (ImRaii.PushIndent(checklistPadding))
{ {
ImGui.TextUnformatted(plugin.Details); ImGui.TextUnformatted(plugin.Details);
if (!isInstalled && ImGui.Button("Open Repository")) if (plugin.DetailsToCheck != null)
Util.OpenLink(plugin.Uri.ToString()); {
foreach (var detail in plugin.DetailsToCheck)
_uiUtils.ChecklistItem(detail.DisplayName, isInstalled && detail.Predicate());
}
ImGui.Spacing();
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Globe, "Open Website"))
Util.OpenLink(plugin.WebsiteUri.ToString());
ImGui.SameLine();
if (plugin.DalamudRepositoryUri != null)
{
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Code, "Open Repository"))
Util.OpenLink(plugin.DalamudRepositoryUri.ToString());
}
else
{
ImGui.AlignTextToFramePadding();
ImGuiComponents.HelpMarker("Available on official Dalamud Repository");
}
} }
} }
@ -162,12 +199,12 @@ internal sealed class OneTimeSetupWindow : LWindow, IDisposable
return _dalamudReflector.TryGetDalamudPlugin(internalName, out _, suppressErrors: true, ignoreCache: true); return _dalamudReflector.TryGetDalamudPlugin(internalName, out _, suppressErrors: true, ignoreCache: true);
} }
public void Dispose()
{
}
private sealed record PluginInfo( private sealed record PluginInfo(
string DisplayName, string DisplayName,
string Details, string Details,
Uri Uri); Uri WebsiteUri,
Uri? DalamudRepositoryUri,
List<PluginDetailInfo>? DetailsToCheck = null);
private sealed record PluginDetailInfo(string DisplayName, Func<bool> Predicate);
} }

View File

@ -13,9 +13,9 @@
}, },
"DalamudPackager": { "DalamudPackager": {
"type": "Direct", "type": "Direct",
"requested": "[2.1.13, )", "requested": "[11.0.0, )",
"resolved": "2.1.13", "resolved": "11.0.0",
"contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA=="
}, },
"DotNet.ReproducibleBuilds": { "DotNet.ReproducibleBuilds": {
"type": "Direct", "type": "Direct",
@ -174,13 +174,13 @@
"gatheringpaths": { "gatheringpaths": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Questionable.Model": "[3.12.0, )" "Questionable.Model": "[4.0.0, )"
} }
}, },
"llib": { "llib": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"DalamudPackager": "[2.1.13, )" "DalamudPackager": "[11.0.0, )"
} }
}, },
"notificationmasterapi": { "notificationmasterapi": {
@ -195,7 +195,7 @@
"questpaths": { "questpaths": {
"type": "Project", "type": "Project",
"dependencies": { "dependencies": {
"Questionable.Model": "[3.12.0, )" "Questionable.Model": "[4.0.0, )"
} }
} }
} }

2
vendor/ECommons vendored

@ -1 +1 @@
Subproject commit 71ee09f7cc2230a73503b945422760da1368405c Subproject commit 6ea40a9eea2e805f2f566fe0493749c7c0639ea3