diff --git a/Directory.Build.targets b/Directory.Build.targets index 8d0cd323..b914cd1e 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 2.5 + 2.6 diff --git a/GatheringPathRenderer/EditorCommands.cs b/GatheringPathRenderer/EditorCommands.cs index 792a3ab3..75c50db6 100644 --- a/GatheringPathRenderer/EditorCommands.cs +++ b/GatheringPathRenderer/EditorCommands.cs @@ -175,7 +175,7 @@ internal sealed class EditorCommands : IDisposable { var territoryInfo = _dataManager.GetExcelSheet()!.GetRow(_clientState.TerritoryType)!; targetFolder = _plugin.PathsDirectory - .CreateSubdirectory(ExpansionData.ExpansionFolders[(byte)territoryInfo.ExVersion.Row]) + .CreateSubdirectory(ExpansionData.ExpansionFolders[(EExpansionVersion)territoryInfo.ExVersion.Row]) .CreateSubdirectory(territoryInfo.PlaceName.Value!.Name.ToString()); } diff --git a/GatheringPathRenderer/GatheringPathRenderer.csproj b/GatheringPathRenderer/GatheringPathRenderer.csproj index 1d3aeae5..fc157f20 100644 --- a/GatheringPathRenderer/GatheringPathRenderer.csproj +++ b/GatheringPathRenderer/GatheringPathRenderer.csproj @@ -1,5 +1,6 @@ + diff --git a/GatheringPathRenderer/RendererPlugin.cs b/GatheringPathRenderer/RendererPlugin.cs index 55dee984..50f9e4a7 100644 --- a/GatheringPathRenderer/RendererPlugin.cs +++ b/GatheringPathRenderer/RendererPlugin.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; @@ -13,6 +14,7 @@ using ECommons; using ECommons.Schedulers; using ECommons.SplatoonAPI; using GatheringPathRenderer.Windows; +using LLib.GameData; using Questionable.Model; using Questionable.Model.Gathering; @@ -33,6 +35,7 @@ public sealed class RendererPlugin : IDalamudPlugin private readonly EditorWindow _editorWindow; private readonly List _gatheringLocations = []; + private EClassJob _currentClassJob; public RendererPlugin(IDalamudPluginInterface pluginInterface, IClientState clientState, ICommandManager commandManager, IDataManager dataManager, ITargetManager targetManager, IChatGui chatGui, @@ -54,6 +57,7 @@ public sealed class RendererPlugin : IDalamudPlugin _editorWindow = new EditorWindow(this, _editorCommands, dataManager, targetManager, clientState, objectTable) { IsOpen = true }; _windowSystem.AddWindow(_editorWindow); + _currentClassJob = (EClassJob?)_clientState.LocalPlayer?.ClassJob.Id ?? EClassJob.Adventurer; _pluginInterface.GetIpcSubscriber("Questionable.ReloadData") .Subscribe(Reload); @@ -63,6 +67,7 @@ public sealed class RendererPlugin : IDalamudPlugin _pluginInterface.UiBuilder.Draw += _windowSystem.Draw; _clientState.TerritoryChanged += TerritoryChanged; + _clientState.ClassJobChanged += ClassJobChanged; if (_clientState.IsLoggedIn) TerritoryChanged(_clientState.TerritoryType); } @@ -147,6 +152,7 @@ public sealed class RendererPlugin : IDalamudPlugin { JsonSerializerOptions options = new() { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault, WriteIndented = true, }; @@ -161,6 +167,7 @@ public sealed class RendererPlugin : IDalamudPlugin using var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, Indented = true }); newNode.WriteTo(writer, options); @@ -171,9 +178,19 @@ public sealed class RendererPlugin : IDalamudPlugin private void TerritoryChanged(ushort territoryId) => Redraw(); - internal void Redraw() + private void ClassJobChanged(uint classJobId) + { + _currentClassJob = (EClassJob)classJobId; + Redraw(_currentClassJob); + } + + internal void Redraw() => Redraw(_currentClassJob); + + private void Redraw(EClassJob classJob) { Splatoon.RemoveDynamicElements("GatheringPathRenderer"); + if (!classJob.IsGatherer()) + return; var elements = GetLocationsInTerritory(_clientState.TerritoryType) .SelectMany(location => @@ -216,8 +233,8 @@ public sealed class RendererPlugin : IDalamudPlugin refY = x.Position.Z, refZ = x.Position.Y, Filled = true, - radius = x.CalculateMinimumDistance(), - Donut = x.CalculateMaximumDistance() - x.CalculateMinimumDistance(), + radius = locationOverride?.MinimumDistance ?? x.CalculateMinimumDistance(), + Donut = (locationOverride?.MaximumDistance ?? x.CalculateMaximumDistance()) - (locationOverride?.MinimumDistance ?? x.CalculateMinimumDistance()), color = _colors[location.Root.Groups.IndexOf(group) % _colors.Count], Enabled = true, coneAngleMin = minimumAngle, @@ -234,8 +251,9 @@ public sealed class RendererPlugin : IDalamudPlugin Enabled = true, overlayText = $"{location.Root.Groups.IndexOf(group)} // {node.DataId} / {node.Locations.IndexOf(x)}", - overlayBGColor = isUnsaved ? 0xFF2020FF : 0, + overlayBGColor = isUnsaved ? 0xFF2020FF : 0xFF000000, }, +#if false new Element(ElementType.CircleAtFixedCoordinates) { refX = a.X, @@ -256,6 +274,7 @@ public sealed class RendererPlugin : IDalamudPlugin Enabled = true, overlayText = "Max Angle" } +#endif }; })))) .ToList(); @@ -284,6 +303,7 @@ public sealed class RendererPlugin : IDalamudPlugin public void Dispose() { + _clientState.ClassJobChanged -= ClassJobChanged; _clientState.TerritoryChanged -= TerritoryChanged; _pluginInterface.UiBuilder.Draw -= _windowSystem.Draw; diff --git a/GatheringPathRenderer/Windows/EditorWindow.cs b/GatheringPathRenderer/Windows/EditorWindow.cs index 6d1f2958..e081c967 100644 --- a/GatheringPathRenderer/Windows/EditorWindow.cs +++ b/GatheringPathRenderer/Windows/EditorWindow.cs @@ -34,7 +34,8 @@ internal sealed class EditorWindow : Window public EditorWindow(RendererPlugin plugin, EditorCommands editorCommands, IDataManager dataManager, ITargetManager targetManager, IClientState clientState, IObjectTable objectTable) - : base("Gathering Path Editor###QuestionableGatheringPathEditor") + : base("Gathering Path Editor###QuestionableGatheringPathEditor", + ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoNavFocus) { _plugin = plugin; _editorCommands = editorCommands; @@ -47,7 +48,11 @@ internal sealed class EditorWindow : Window { MinimumSize = new Vector2(300, 300), }; + + RespectCloseHotkey = false; ShowCloseButton = false; + AllowPinning = false; + AllowClickthrough = false; } public override void Update() @@ -89,7 +94,8 @@ internal sealed class EditorWindow : Window return; } - _target ??= _objectTable.Where(x => x.ObjectKind == ObjectKind.GatheringPoint && x.DataId == location.Node.DataId) + _target ??= _objectTable + .Where(x => x.ObjectKind == ObjectKind.GatheringPoint && x.DataId == location.Node.DataId) .Select(x => new { Object = x, @@ -129,18 +135,20 @@ internal sealed class EditorWindow : Window } int minAngle = locationOverride.MinimumAngle ?? location.MinimumAngle.GetValueOrDefault(); - if (ImGui.DragInt("Min Angle", ref minAngle, 5, -360, 360)) + int maxAngle = locationOverride.MaximumAngle ?? location.MaximumAngle.GetValueOrDefault(); + if (ImGui.DragIntRange2("Angle", ref minAngle, ref maxAngle, 5, -360, 360)) { locationOverride.MinimumAngle = minAngle; - locationOverride.MaximumAngle ??= location.MaximumAngle.GetValueOrDefault(); + locationOverride.MaximumAngle = maxAngle; _plugin.Redraw(); } - int maxAngle = locationOverride.MaximumAngle ?? location.MaximumAngle.GetValueOrDefault(); - if (ImGui.DragInt("Max Angle", ref maxAngle, 5, -360, 360)) + float minDistance = locationOverride.MinimumDistance ?? location.CalculateMinimumDistance(); + float maxDistance = locationOverride.MaximumDistance ?? location.CalculateMaximumDistance(); + if (ImGui.DragFloatRange2("Distance", ref minDistance, ref maxDistance, 0.1f, 1f, 3f)) { - locationOverride.MinimumAngle ??= location.MinimumAngle.GetValueOrDefault(); - locationOverride.MaximumAngle = maxAngle; + locationOverride.MinimumDistance = minDistance; + locationOverride.MaximumDistance = maxDistance; _plugin.Redraw(); } @@ -150,8 +158,18 @@ internal sealed class EditorWindow : Window ImGui.PushStyleColor(ImGuiCol.Button, ImGuiColors.DalamudRed); if (ImGui.Button("Save")) { - location.MinimumAngle = locationOverride.MinimumAngle; - location.MaximumAngle = locationOverride.MaximumAngle; + if (locationOverride is { MinimumAngle: not null, MaximumAngle: not null }) + { + location.MinimumAngle = locationOverride.MinimumAngle ?? location.MinimumAngle; + location.MaximumAngle = locationOverride.MaximumAngle ?? location.MaximumAngle; + } + + if (locationOverride is { MinimumDistance: not null, MaximumDistance: not null }) + { + location.MinimumDistance = locationOverride.MinimumDistance; + location.MaximumDistance = locationOverride.MaximumDistance; + } + _plugin.Save(context.File, context.Root); } @@ -243,6 +261,6 @@ internal sealed class LocationOverride public bool NeedsSave() { - return MinimumAngle != null && MaximumAngle != null; + return (MinimumAngle != null && MaximumAngle != null) || (MinimumDistance != null && MaximumDistance != null); } } diff --git a/GatheringPathRenderer/packages.lock.json b/GatheringPathRenderer/packages.lock.json index 269c43d7..f7b5b4d3 100644 --- a/GatheringPathRenderer/packages.lock.json +++ b/GatheringPathRenderer/packages.lock.json @@ -92,6 +92,12 @@ "ecommons": { "type": "Project" }, + "llib": { + "type": "Project", + "dependencies": { + "DalamudPackager": "[2.1.13, )" + } + }, "questionable.model": { "type": "Project", "dependencies": { diff --git a/GatheringPaths/3.x - Heavensward/Coerthas Western Highlands/351_Red Rim_MIN.json b/GatheringPaths/3.x - Heavensward/Coerthas Western Highlands/351_Red Rim_MIN.json index cb1d96af..e61ee374 100644 --- a/GatheringPaths/3.x - Heavensward/Coerthas Western Highlands/351_Red Rim_MIN.json +++ b/GatheringPaths/3.x - Heavensward/Coerthas Western Highlands/351_Red Rim_MIN.json @@ -16,12 +16,15 @@ "Z": 405.1829 }, "MinimumAngle": 100, - "MaximumAngle": 250 + "MaximumAngle": 250, + "MinimumDistance": 1.5, + "MaximumDistance": 3 } ] }, { "DataId": 31345, + "Fly": false, "Locations": [ { "Position": { @@ -29,8 +32,10 @@ "Y": 216.5585, "Z": 412.4353 }, - "MinimumAngle": 50, - "MaximumAngle": 165 + "MinimumAngle": 75, + "MaximumAngle": 145, + "MinimumDistance": 1.5, + "MaximumDistance": 3 }, { "Position": { @@ -39,7 +44,9 @@ "Z": 421.5481 }, "MinimumAngle": 0, - "MaximumAngle": 145 + "MaximumAngle": 145, + "MinimumDistance": 1.5, + "MaximumDistance": 3 }, { "Position": { @@ -48,7 +55,9 @@ "Z": 408.2164 }, "MinimumAngle": 155, - "MaximumAngle": 225 + "MaximumAngle": 225, + "MinimumDistance": 1.5, + "MaximumDistance": 3 } ] } @@ -155,4 +164,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/GatheringPaths/4.x - Stormblood/The Ruby Sea/533_The Turquoise Trench_MIN.json b/GatheringPaths/4.x - Stormblood/The Ruby Sea/533_The Turquoise Trench_MIN.json index 7134c24b..f886de4f 100644 --- a/GatheringPaths/4.x - Stormblood/The Ruby Sea/533_The Turquoise Trench_MIN.json +++ b/GatheringPaths/4.x - Stormblood/The Ruby Sea/533_The Turquoise Trench_MIN.json @@ -7,6 +7,7 @@ "[Kugane] Aetheryte Plaza", "[Kugane] The Ruby Price" ], + "FlyBetweenNodes": true, "Groups": [ { "Nodes": [ @@ -33,8 +34,10 @@ "Y": 0.503479, "Z": 634.821 }, - "MinimumAngle": 60, - "MaximumAngle": 150 + "MinimumAngle": 45, + "MaximumAngle": 90, + "MinimumDistance": 1.6, + "MaximumDistance": 3 }, { "Position": { @@ -132,4 +135,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/GatheringPaths/7.x - Dawntrail/Kozama'uka/946__BTN.json b/GatheringPaths/7.x - Dawntrail/Kozama'uka/946__BTN.json new file mode 100644 index 00000000..b97d0790 --- /dev/null +++ b/GatheringPaths/7.x - Dawntrail/Kozama'uka/946__BTN.json @@ -0,0 +1,105 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "liza", + "TerritoryId": 1188, + "AetheryteShortcut": "Kozama'uka - Ok'hanu", + "FlyBetweenNodes": true, + "Groups": [ + { + "Nodes": [ + { + "DataId": 34520, + "Locations": [ + { + "Position": { + "X": 759.8123, + "Y": 26.14559, + "Z": -561.7435 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34521, + "Locations": [ + { + "Position": { + "X": 791.0515, + "Y": 25.74059, + "Z": -545.9295 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34522, + "Locations": [ + { + "Position": { + "X": 821.4519, + "Y": 28.47348, + "Z": -533.9607 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34517, + "Locations": [ + { + "Position": { + "X": 840.8483, + "Y": 34.05744, + "Z": -586.0533 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34518, + "Locations": [ + { + "Position": { + "X": 837.7969, + "Y": 33.55795, + "Z": -619.7623 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34519, + "Locations": [ + { + "Position": { + "X": 784.021, + "Y": 24.16835, + "Z": -598.9781 + } + } + ] + } + ] + } + ] +} diff --git a/GatheringPaths/7.x - Dawntrail/Urqopacha/961__MIN.json b/GatheringPaths/7.x - Dawntrail/Urqopacha/961__MIN.json new file mode 100644 index 00000000..566b0c30 --- /dev/null +++ b/GatheringPaths/7.x - Dawntrail/Urqopacha/961__MIN.json @@ -0,0 +1,118 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "liza", + "TerritoryId": 1187, + "AetheryteShortcut": "Urqopacha - Wachunpelo", + "FlyBetweenNodes": false, + "Groups": [ + { + "Nodes": [ + { + "DataId": 34646, + "Locations": [ + { + "Position": { + "X": 227.4615, + "Y": -89.93336, + "Z": -225.4792 + }, + "MinimumAngle": 150, + "MaximumAngle": 250 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34641, + "Locations": [ + { + "Position": { + "X": 249.5856, + "Y": -97.79176, + "Z": -217.3474 + }, + "MinimumAngle": 135, + "MaximumAngle": 215 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34642, + "Locations": [ + { + "Position": { + "X": 257.8141, + "Y": -99.51778, + "Z": -217.7757 + }, + "MinimumAngle": 130, + "MaximumAngle": 240 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34643, + "Fly": true, + "Locations": [ + { + "Position": { + "X": 274.7205, + "Y": -99.65348, + "Z": -201.6824 + }, + "MinimumAngle": 220, + "MaximumAngle": 270 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34644, + "Locations": [ + { + "Position": { + "X": 278.0735, + "Y": -101.2599, + "Z": -194.8121 + }, + "MinimumAngle": 200, + "MaximumAngle": 300 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34645, + "Locations": [ + { + "Position": { + "X": 308.4911, + "Y": -100.6525, + "Z": -174.6859 + }, + "MinimumAngle": 145, + "MaximumAngle": 210 + } + ] + } + ] + } + ] +} diff --git a/GatheringPaths/7.x - Dawntrail/Yak T'el/955__BTN.json b/GatheringPaths/7.x - Dawntrail/Yak T'el/955__BTN.json new file mode 100644 index 00000000..68779daa --- /dev/null +++ b/GatheringPaths/7.x - Dawntrail/Yak T'el/955__BTN.json @@ -0,0 +1,117 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "liza", + "TerritoryId": 1189, + "AetheryteShortcut": "Yak T'el - Iq Br'aax", + "FlyBetweenNodes": true, + "Groups": [ + { + "Nodes": [ + { + "DataId": 34601, + "Locations": [ + { + "Position": { + "X": 484.1779, + "Y": 16.59889, + "Z": -304.2079 + }, + "MinimumAngle": -185, + "MaximumAngle": 20 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34599, + "Locations": [ + { + "Position": { + "X": 509.181, + "Y": 21.64949, + "Z": -349.9709 + }, + "MinimumAngle": -25, + "MaximumAngle": 80 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34597, + "Locations": [ + { + "Position": { + "X": 534.7657, + "Y": 19.33411, + "Z": -333.3713 + }, + "MinimumAngle": 155, + "MaximumAngle": 275 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34600, + "Locations": [ + { + "Position": { + "X": 525.0291, + "Y": 11.97125, + "Z": -252.6589 + }, + "MinimumAngle": 145, + "MaximumAngle": 265 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34598, + "Locations": [ + { + "Position": { + "X": 518.5205, + "Y": 9.694121, + "Z": -223.9382 + }, + "MinimumAngle": 65, + "MaximumAngle": 170 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34602, + "Locations": [ + { + "Position": { + "X": 480.2552, + "Y": 10.94543, + "Z": -234.4949 + }, + "MinimumAngle": 95, + "MaximumAngle": 180 + } + ] + } + ] + } + ] +} diff --git a/GatheringPaths/7.x - Dawntrail/Yak T'el/970__MIN.json b/GatheringPaths/7.x - Dawntrail/Yak T'el/970__MIN.json index 3cafe531..27cfb7e2 100644 --- a/GatheringPaths/7.x - Dawntrail/Yak T'el/970__MIN.json +++ b/GatheringPaths/7.x - Dawntrail/Yak T'el/970__MIN.json @@ -2,6 +2,7 @@ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", "Author": "liza", "TerritoryId": 1189, + "AetheryteShortcut": "Yak T'el - Mamook", "Groups": [ { "Nodes": [ @@ -112,4 +113,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/GatheringPaths/gatheringlocation-v1.json b/GatheringPaths/gatheringlocation-v1.json index baac742c..ffb288ab 100644 --- a/GatheringPaths/gatheringlocation-v1.json +++ b/GatheringPaths/gatheringlocation-v1.json @@ -34,6 +34,11 @@ "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard" } }, + "FlyBetweenNodes": { + "description": "If nodes are close enough together, flying makes no sense due to the pathfinding overhead", + "type": "boolean", + "default": true + }, "Groups": { "type": "array", "items": { @@ -49,6 +54,9 @@ "minimum": 30000, "maximum": 50000 }, + "Fly": { + "type": "boolean" + }, "Locations": { "type": "array", "items": { diff --git a/QuestPathGenerator/GatheringSourceGenerator.cs b/QuestPathGenerator/GatheringSourceGenerator.cs index 589aabb2..6ba6efbb 100644 --- a/QuestPathGenerator/GatheringSourceGenerator.cs +++ b/QuestPathGenerator/GatheringSourceGenerator.cs @@ -143,6 +143,7 @@ public class GatheringSourceGenerator : ISourceGenerator { try { + var emptyRoot = new GatheringRoot(); return ObjectCreationExpression( IdentifierName(nameof(GatheringRoot))) .WithInitializer( @@ -151,10 +152,17 @@ public class GatheringSourceGenerator : ISourceGenerator SeparatedList( SyntaxNodeList( AssignmentList(nameof(GatheringRoot.Author), root.Author).AsSyntaxNodeOrToken(), - Assignment(nameof(GatheringRoot.TerritoryId), root.TerritoryId, default) + Assignment(nameof(GatheringRoot.TerritoryId), root.TerritoryId, emptyRoot.TerritoryId) + .AsSyntaxNodeOrToken(), + Assignment(nameof(GatheringRoot.AetheryteShortcut), root.AetheryteShortcut, + emptyRoot.AetheryteShortcut) + .AsSyntaxNodeOrToken(), + Assignment(nameof(GatheringRoot.AethernetShortcut), root.AethernetShortcut, + emptyRoot.AethernetShortcut) + .AsSyntaxNodeOrToken(), + Assignment(nameof(GatheringRoot.FlyBetweenNodes), root.FlyBetweenNodes, + emptyRoot.FlyBetweenNodes) .AsSyntaxNodeOrToken(), - Assignment(nameof(GatheringRoot.AetheryteShortcut), root.AetheryteShortcut, null), - Assignment(nameof(GatheringRoot.AethernetShortcut), root.AethernetShortcut, null), AssignmentList(nameof(GatheringRoot.Groups), root.Groups).AsSyntaxNodeOrToken())))); } catch (Exception e) diff --git a/QuestPathGenerator/RoslynShortcuts.cs b/QuestPathGenerator/RoslynShortcuts.cs index 21b4a820..d8ff117d 100644 --- a/QuestPathGenerator/RoslynShortcuts.cs +++ b/QuestPathGenerator/RoslynShortcuts.cs @@ -408,6 +408,8 @@ public static class RoslynShortcuts Assignment(nameof(GatheringNode.DataId), nodeLocation.DataId, emptyLocation.DataId) .AsSyntaxNodeOrToken(), + Assignment(nameof(GatheringNode.Fly), nodeLocation.Fly, emptyLocation.Fly) + .AsSyntaxNodeOrToken(), AssignmentList(nameof(GatheringNode.Locations), nodeLocation.Locations) .AsSyntaxNodeOrToken())))); } diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1049_Pride and Duty (Will Take You from the Mountain).json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1049_Pride and Duty (Will Take You from the Mountain).json index 82d964c7..bb55e9b1 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1049_Pride and Duty (Will Take You from the Mountain).json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1049_Pride and Duty (Will Take You from the Mountain).json @@ -13,7 +13,23 @@ "Z": -255.8786 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 129 + ] + }, + "AethernetShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1050_Embracing the Beast.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1050_Embracing the Beast.json index 1ec8610d..1dcf9d26 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1050_Embracing the Beast.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1050_Embracing the Beast.json @@ -8,7 +8,13 @@ { "TerritoryId": 137, "InteractionType": "EquipItem", - "ItemId": 4544 + "ItemId": 4544, + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } }, { "DataId": 1006746, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1051_Curious Gorge Goes to Wineport.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1051_Curious Gorge Goes to Wineport.json index c43955a8..8982961e 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1051_Curious Gorge Goes to Wineport.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1051_Curious Gorge Goes to Wineport.json @@ -13,7 +13,13 @@ "Z": 74.47925 }, "TerritoryId": 137, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json index c87c93ab..a3ae2649 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json @@ -13,7 +13,13 @@ "Z": 74.47925 }, "TerritoryId": 137, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, @@ -202,7 +208,8 @@ "Z": 74.47925 }, "TerritoryId": 137, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol" } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1053_Proof Is the Pudding.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1053_Proof Is the Pudding.json index ff849d9e..3cd15619 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1053_Proof Is the Pudding.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1053_Proof Is the Pudding.json @@ -13,7 +13,13 @@ "Z": 74.47925 }, "TerritoryId": 137, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1054_How to Quit You.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1054_How to Quit You.json index be915bcc..08758166 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1054_How to Quit You.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1054_How to Quit You.json @@ -13,7 +13,13 @@ "Z": 74.47925 }, "TerritoryId": 137, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/317_The Mountain That Strides.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/317_The Mountain That Strides.json index 70514ec1..0e86a9b9 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/317_The Mountain That Strides.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/317_The Mountain That Strides.json @@ -13,7 +13,23 @@ "Z": -255.8786 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 129 + ] + }, + "AethernetShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/318_Bleeder of the Pack.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/318_Bleeder of the Pack.json index 4a18aedf..27eafbcd 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/318_Bleeder of the Pack.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/318_Bleeder of the Pack.json @@ -13,7 +13,23 @@ "Z": -255.8786 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 129 + ] + }, + "AethernetShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/319_Bringing Down the Mountain.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/319_Bringing Down the Mountain.json index c35e45ad..143a5e5d 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/319_Bringing Down the Mountain.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/319_Bringing Down the Mountain.json @@ -13,7 +13,23 @@ "Z": -255.8786 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 129 + ] + }, + "AethernetShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json index 059597cc..5b73f421 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json @@ -30,6 +30,26 @@ "InteractionType": "WalkTo", "AetheryteShortcut": "Western Thanalan - Horizon" }, + { + "Position": { + "X": -396.50018, + "Y": 23, + "Z": -351.0944 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": -408.92343, + "Y": 23.167036, + "Z": -351.16223 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo", + "$": "Vesper Bay Gate", + "DisableNavmesh": true + }, { "DataId": 1004603, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/3869_The Best Inventions.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/3869_The Best Inventions.json index 327a2005..5d05d1dc 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/3869_The Best Inventions.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/3869_The Best Inventions.json @@ -58,6 +58,26 @@ { "Sequence": 255, "Steps": [ + { + "Position": { + "X": -421.5307, + "Y": 219.52408, + "Z": -292.88748 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (bottom)" + }, + { + "Position": { + "X": -417.45395, + "Y": 223.30249, + "Z": -291.59283 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (top)" + }, { "DataId": 1006461, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json index a645698b..0dc1d448 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json @@ -41,6 +41,26 @@ { "Sequence": 2, "Steps": [ + { + "Position": { + "X": -421.5307, + "Y": 219.52408, + "Z": -292.88748 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (bottom)" + }, + { + "Position": { + "X": -417.45395, + "Y": 223.30249, + "Z": -291.59283 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (top)" + }, { "DataId": 1006442, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json index 8a35a23e..27b1f566 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json @@ -35,10 +35,14 @@ "Z": 89.58569 }, "TerritoryId": 155, - "InteractionType": "Combat", + "InteractionType": "Instruction", + "Comment": "Use Quest item on enemy to weaken it first", + "$": "Status Effects: 22 (HP Penalty) + 62 (Damage Down)", "EnemySpawnType": "AfterInteraction", - "KillEnemyDataIds": [ - 2196 + "ComplexCombatData": [ + { + "DataId": 2196 + } ] } ] @@ -136,6 +140,26 @@ { "Sequence": 255, "Steps": [ + { + "Position": { + "X": -421.5307, + "Y": 219.52408, + "Z": -292.88748 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (bottom)" + }, + { + "Position": { + "X": -417.45395, + "Y": 223.30249, + "Z": -291.59283 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (top)" + }, { "DataId": 1007567, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C0-Coerthas Central Highlands, Whitebrim Front/938_Influencing Inquisitors.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C0-Coerthas Central Highlands, Whitebrim Front/938_Influencing Inquisitors.json index f759632d..fdfa9425 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C0-Coerthas Central Highlands, Whitebrim Front/938_Influencing Inquisitors.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C0-Coerthas Central Highlands, Whitebrim Front/938_Influencing Inquisitors.json @@ -26,6 +26,26 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": -417.45395, + "Y": 223.30249, + "Z": -291.59283 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (top)" + }, + { + "Position": { + "X": -421.5307, + "Y": 219.52408, + "Z": -292.88748 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Comment": "North Whitebrim, Stairs (bottom)" + }, { "DataId": 1006466, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/956_With the Utmost Care.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/956_With the Utmost Care.json index f34692fb..12c69c23 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/956_With the Utmost Care.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/956_With the Utmost Care.json @@ -26,6 +26,18 @@ { "Sequence": 1, "Steps": [ + { + + "DataId": 2002327, + "Position": { + "X": 423.17834, + "Y": -62.45526, + "Z": 213.39734 + }, + "StopDistance": 3, + "TerritoryId": 145, + "InteractionType": "WalkTo" + }, { "DataId": 2002327, "Position": { @@ -35,7 +47,8 @@ }, "TerritoryId": 145, "InteractionType": "UseItem", - "ItemId": 2000742 + "ItemId": 2000742, + "DelaySecondsAtStart": 2 } ] }, @@ -51,7 +64,8 @@ }, "TerritoryId": 145, "InteractionType": "UseItem", - "ItemId": 2000837 + "ItemId": 2000837, + "DelaySecondsAtStart": 3 } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C4-Coerthas Central Highlands, Biggs and Wedge/986_Getting Even with Garlemald.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C4-Coerthas Central Highlands, Biggs and Wedge/986_Getting Even with Garlemald.json index 5047a8fd..64d11f3d 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C4-Coerthas Central Highlands, Biggs and Wedge/986_Getting Even with Garlemald.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C4-Coerthas Central Highlands, Biggs and Wedge/986_Getting Even with Garlemald.json @@ -32,7 +32,8 @@ "EnemySpawnType": "AfterInteraction", "KillEnemyDataIds": [ 43 - ] + ], + "CombatDelaySecondsAtStart": 5 } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json index c9fc5c3a..d1a4fdbf 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json @@ -20,6 +20,27 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": -148.50606, + "Y": -0.6686005, + "Z": -615.3246 + }, + "TerritoryId": 156, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + } + }, { "DataId": 2002232, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1002_Acting the Part.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1002_Acting the Part.json index f0476196..18db877a 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1002_Acting the Part.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1002_Acting the Part.json @@ -31,7 +31,8 @@ "EnemySpawnType": "AutoOnEnterArea", "KillEnemyDataIds": [ 55 - ] + ], + "CombatDelaySecondsAtStart": 5 }, { "DataId": 2002238, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/521_Escape from Castrum Centri.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/521_Escape from Castrum Centri.json index bef768cf..d25a39ab 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/521_Escape from Castrum Centri.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/521_Escape from Castrum Centri.json @@ -137,6 +137,15 @@ { "Sequence": 5, "Steps": [ + { + "Position": { + "X": -427.75616, + "Y": -0.77819824, + "Z": -273.82324 + }, + "TerritoryId": 335, + "InteractionType": "EquipRecommended" + }, { "DataId": 2002376, "Position": { @@ -159,6 +168,7 @@ "Y": 84, "Z": 2.1514893 }, + "StopDistance": 5, "TerritoryId": 130, "InteractionType": "CompleteQuest" } diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/522_The Black Wolf's Ultimatum.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/522_The Black Wolf's Ultimatum.json index 2f41f0d3..26c86696 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/522_The Black Wolf's Ultimatum.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/522_The Black Wolf's Ultimatum.json @@ -12,6 +12,7 @@ "Y": 84, "Z": 2.1514893 }, + "StopDistance": 5, "TerritoryId": 130, "InteractionType": "AcceptQuest" } diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json index db78c308..f56eca2f 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json @@ -31,7 +31,8 @@ "Z": -0.015319824 }, "TerritoryId": 212, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 212 }, { "DataId": 2001716, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1359_The Gift of Eternity.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1359_The Gift of Eternity.json index 7c878205..30c0364a 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1359_The Gift of Eternity.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1359_The Gift of Eternity.json @@ -22,9 +22,9 @@ "Steps": [ { "Position": { - "X": -209.9414, - "Y": -42.109043, - "Z": -248.07559 + "X": -203.21945, + "Y": -42.30963, + "Z": -253.10411 }, "StopDistance": 0.25, "TerritoryId": 138, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1360_Into the Heart of the Whorl.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1360_Into the Heart of the Whorl.json index 7ab58484..5ab26e65 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1360_Into the Heart of the Whorl.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E2-2.2/1360_Into the Heart of the Whorl.json @@ -117,7 +117,12 @@ }, "TerritoryId": 135, "InteractionType": "WalkTo", - "Mount": true + "Mount": true, + "SkipConditions": { + "StepIf": { + "AetheryteUnlocked": "Lower La Noscea - Moraby Drydocks" + } + } }, { "Position": { @@ -127,12 +132,22 @@ }, "TerritoryId": 135, "InteractionType": "WalkTo", - "Fly": true + "Fly": true, + "SkipConditions": { + "StepIf": { + "AetheryteUnlocked": "Lower La Noscea - Moraby Drydocks" + } + } }, { "TerritoryId": 135, "InteractionType": "AttuneAetheryte", - "Aetheryte": "Lower La Noscea - Moraby Drydocks" + "Aetheryte": "Lower La Noscea - Moraby Drydocks", + "SkipConditions": { + "StepIf": { + "AetheryteUnlocked": "Lower La Noscea - Moraby Drydocks" + } + } }, { "Position": { @@ -142,7 +157,13 @@ }, "TerritoryId": 135, "InteractionType": "WalkTo", - "Fly": true + "Fly": true, + "AetheryteShortcut": "Lower La Noscea - Moraby Drydocks", + "SkipConditions": { + "AetheryteShortcutIf": { + "AetheryteLocked": "Lower La Noscea - Moraby Drydocks" + } + } }, { "DataId": 1008693, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E3-2.3/3884_Reap the Whirlwind.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E3-2.3/3884_Reap the Whirlwind.json index 5f3c8fcd..1550fa2e 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E3-2.3/3884_Reap the Whirlwind.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E3-2.3/3884_Reap the Whirlwind.json @@ -91,6 +91,17 @@ { "Sequence": 255, "Steps": [ + { + "Position": { + "X": -119.1183, + "Y": 3.7999938, + "Z": -104.33473 + }, + "TerritoryId": 130, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Ul'dah", + "$": "Ul'dah Aetheryte to Immortal Flames" + }, { "DataId": 1004576, "Position": { @@ -99,8 +110,7 @@ "Z": -114.67157 }, "TerritoryId": 130, - "InteractionType": "CompleteQuest", - "AetheryteShortcut": "Ul'dah" + "InteractionType": "CompleteQuest" } ] } diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/69_Dark Words, Dark Deeds.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/69_Dark Words, Dark Deeds.json index cea34345..ff496711 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/69_Dark Words, Dark Deeds.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/69_Dark Words, Dark Deeds.json @@ -87,6 +87,16 @@ { "Sequence": 4, "Steps": [ + { + "Position": { + "X": -340.60776, + "Y": 259.52878, + "Z": 58.521606 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "Fly": true + }, { "DataId": 2004655, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/88_The Reason Roaille.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/88_The Reason Roaille.json index f8041a01..49bf11b4 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/88_The Reason Roaille.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/88_The Reason Roaille.json @@ -86,6 +86,7 @@ "Y": 71.617355, "Z": -132.52466 }, + "StopDistance": 5, "TerritoryId": 147, "InteractionType": "CompleteQuest" } diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/89_Let Us Cling Together.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/89_Let Us Cling Together.json index 92de12da..ab57d1ce 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/89_Let Us Cling Together.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/89_Let Us Cling Together.json @@ -12,6 +12,7 @@ "Y": 71.617355, "Z": -132.52466 }, + "StopDistance": 5, "TerritoryId": 147, "InteractionType": "AcceptQuest", "AetheryteShortcut": "Northern Thanalan - Ceruleum Processing Plant", diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/363_Good Intentions.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/363_Good Intentions.json index e5479567..cb4b995d 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/363_Good Intentions.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/363_Good Intentions.json @@ -5,6 +5,46 @@ { "Sequence": 0, "Steps": [ + { + "TerritoryId": 156, + "DataId": 2002881, + "Position": { + "X": 21.133728, + "Y": 22.323914, + "Z": -631.281 + }, + "InteractionType": "Interact", + "TargetTerritoryId": 351, + "AetheryteShortcut": "Mor Dhona", + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 351 + ] + }, + "AetheryteShortcutIf": { + "InTerritory": [ + 351 + ] + } + } + }, + { + "DataId": 2002878, + "Position": { + "X": -0.015319824, + "Y": -1.0223389, + "Z": -26.779602 + }, + "TerritoryId": 351, + "InteractionType": "Interact", + "TargetTerritoryId": 351, + "SkipConditions": { + "StepIf": { + "ExtraCondition": "RisingStonesSolar" + } + } + }, { "DataId": 1008969, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/372_The Wyrm's Roar.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/372_The Wyrm's Roar.json index 5988dd6f..2ce108c1 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/372_The Wyrm's Roar.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/372_The Wyrm's Roar.json @@ -63,6 +63,16 @@ } ] }, + { + "Position": { + "X": 4.0611796, + "Y": 0.0149827, + "Z": 4.914047 + }, + "TerritoryId": 395, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, { "DataId": 1009974, "Position": { @@ -71,7 +81,8 @@ "Z": -0.015319824 }, "TerritoryId": 395, - "InteractionType": "Interact" + "InteractionType": "Interact", + "DisableNavmesh": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/425_A Time to Every Purpose.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/425_A Time to Every Purpose.json index 97e2d9c3..20804dd8 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/425_A Time to Every Purpose.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E6-2.55/425_A Time to Every Purpose.json @@ -5,6 +5,46 @@ { "Sequence": 0, "Steps": [ + { + "TerritoryId": 156, + "DataId": 2002881, + "Position": { + "X": 21.133728, + "Y": 22.323914, + "Z": -631.281 + }, + "InteractionType": "Interact", + "TargetTerritoryId": 351, + "AetheryteShortcut": "Mor Dhona", + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 351 + ] + }, + "AetheryteShortcutIf": { + "InTerritory": [ + 351 + ] + } + } + }, + { + "DataId": 2002878, + "Position": { + "X": -0.015319824, + "Y": -1.0223389, + "Z": -26.779602 + }, + "TerritoryId": 351, + "InteractionType": "Interact", + "TargetTerritoryId": 351, + "SkipConditions": { + "StepIf": { + "ExtraCondition": "RisingStonesSolar" + } + } + }, { "DataId": 1010897, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Misc/1162_My Feisty Little Chocobo.json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Misc/1162_My Feisty Little Chocobo.json new file mode 100644 index 00000000..55b1d542 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Misc/1162_My Feisty Little Chocobo.json @@ -0,0 +1,119 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1002754, + "Position": { + "X": -219.22644, + "Y": 20.923328, + "Z": 338.4298 + }, + "TerritoryId": 153, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2001467, + "Position": { + "X": -44.419067, + "Y": 1.4190674, + "Z": -36.850586 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -230.51279, + "Y": 57.95885, + "Z": -84.411194 + }, + "TerritoryId": 148, + "InteractionType": "UseItem", + "ItemId": 4868 + }, + { + "Position": { + "X": -230.51279, + "Y": 57.95885, + "Z": -84.411194 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "ComplexCombatData": [ + { + "DataId": 178, + "MinimumKillCount": 3 + } + ], + "EnemySpawnType": "OverworldEnemies" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Fringes/2639_Magiteknical Failure.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Fringes/2639_Magiteknical Failure.json new file mode 100644 index 00000000..7f1657a2 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Fringes/2639_Magiteknical Failure.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019517, + "Position": { + "X": -653.0099, + "Y": 129.91537, + "Z": -510.67374 + }, + "TerritoryId": 612, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019523, + "Position": { + "X": -623.74304, + "Y": 130, + "Z": -483.7873 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -449.52835, + "Y": 105.07213, + "Z": -401.3476 + }, + "StopDistance": 0.5, + "TerritoryId": 612, + "InteractionType": "Instruction", + "Comment": "Manual combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7504 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -232.26196, + "Y": 64.93323, + "Z": -676.26465 + }, + "StopDistance": 2, + "TerritoryId": 612, + "InteractionType": "Instruction", + "Comment": "Manual combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7505 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019517, + "Position": { + "X": -653.0099, + "Y": 129.91537, + "Z": -510.67374 + }, + "TerritoryId": 612, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Fringes/2661_The Hidden Truth.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Fringes/2661_The Hidden Truth.json new file mode 100644 index 00000000..62b1a0e5 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Fringes/2661_The Hidden Truth.json @@ -0,0 +1,107 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019519, + "Position": { + "X": -613.1228, + "Y": 130, + "Z": -529.839 + }, + "TerritoryId": 612, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1023142, + "Position": { + "X": -642.9083, + "Y": 130.25946, + "Z": -538.29254 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1023143, + "Position": { + "X": -631.0674, + "Y": 130.30254, + "Z": -465.96478 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1023147, + "Position": { + "X": -429.4652, + "Y": 75.3867, + "Z": -124.712036 + }, + "TerritoryId": 612, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7217, + 7553 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1023148, + "Position": { + "X": -429.89246, + "Y": 74.88393, + "Z": -118.30322 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1023147, + "Position": { + "X": -429.4652, + "Y": 75.3867, + "Z": -124.712036 + }, + "TerritoryId": 612, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Peaks/2655_Saint Sayer.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Peaks/2655_Saint Sayer.json new file mode 100644 index 00000000..f94bd729 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Peaks/2655_Saint Sayer.json @@ -0,0 +1,96 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020841, + "Position": { + "X": 146.01355, + "Y": 118.1921, + "Z": -730.4951 + }, + "TerritoryId": 620, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Peaks - Ala Gannha", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021752, + "Position": { + "X": 14.724915, + "Y": 118.08588, + "Z": -776.82153 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021752, + "Position": { + "X": 14.724915, + "Y": 118.08588, + "Z": -776.82153 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 656.90076, + "Y": 231.05865, + "Z": -611.2172 + }, + "TerritoryId": 620, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 6609, + "MinimumKillCount": 2, + "RewardItemId": 2002205, + "RewardItemCount": 2 + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021752, + "Position": { + "X": 14.724915, + "Y": 118.08588, + "Z": -776.82153 + }, + "TerritoryId": 620, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Peaks - Ala Gannha" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2632_The Palace of Lost Souls.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2632_The Palace of Lost Souls.json new file mode 100644 index 00000000..7425f2d3 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2632_The Palace of Lost Souls.json @@ -0,0 +1,140 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023280, + "Position": { + "X": -62.790894, + "Y": -198.96509, + "Z": -64.34735 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDY001_02632_Q1_000_050", + "Answer": "TEXT_STMBDY001_02632_A1_000_051" + } + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019197, + "Position": { + "X": -8.926575, + "Y": -187.08374, + "Z": -95.018005 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 21.067955, + "Y": -197.78902, + "Z": -155.23956 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "$": "Sui-no-Sato, NE inside" + }, + { + "Position": { + "X": -238.47687, + "Y": -192.81738, + "Z": 329.51413 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "$": "To shorten pathfinding time, not strictly necessary" + }, + { + "DataId": 1023293, + "Position": { + "X": -957.15265, + "Y": -895.9945, + "Z": 756.83215 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "TerritoryId": 613, + "InteractionType": "Duty", + "ContentFinderConditionId": 235 + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1023293, + "Position": { + "X": -957.15265, + "Y": -895.9945, + "Z": 756.83215 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "StopDistance": 8 + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 322.1539, + "Y": -121.22571, + "Z": -314.2446 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Ruby Sea - Tamamizu" + }, + { + "Position": { + "X": 22.288645, + "Y": -196.2301, + "Z": -155.5739 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "$": "Sui-no-Sato, NE outside" + }, + { + "DataId": 1023280, + "Position": { + "X": -62.790894, + "Y": -198.96509, + "Z": -64.34735 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2673_The Price of Betrayal.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2673_The Price of Betrayal.json new file mode 100644 index 00000000..c3e30948 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2673_The Price of Betrayal.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019168, + "Position": { + "X": 501.33508, + "Y": 34.0062, + "Z": 781.70435 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019154, + "Position": { + "X": 829.1294, + "Y": 5.9230084, + "Z": 859.739 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] The Ruby Price" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 595.4312, + "Y": -0.26869023, + "Z": 800.52985 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": 459.92212, + "Y": -0.19133466, + "Z": 672.5903 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1022745, + "Position": { + "X": 288.6853, + "Y": -0.5, + "Z": 393.78955 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7497 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019154, + "Position": { + "X": 829.1294, + "Y": 5.9230084, + "Z": 859.739 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] The Ruby Price" + ] + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2687_Pulling Double Booty.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2687_Pulling Double Booty.json new file mode 100644 index 00000000..315a02e4 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2687_Pulling Double Booty.json @@ -0,0 +1,97 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1022102, + "Position": { + "X": 97.8866, + "Y": 2.096308, + "Z": -617.79205 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022103, + "Position": { + "X": -47.135193, + "Y": 2.8637304, + "Z": -636.286 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022122, + "Position": { + "X": 134.66089, + "Y": 12.000001, + "Z": 69.047 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] The Ruby Bazaar" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1019049, + "Position": { + "X": -130.87665, + "Y": -5.000044, + "Z": 140.82544 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Pier #1" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1022117, + "Position": { + "X": -49.515564, + "Y": 2.6587384, + "Z": -636.56067 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2693_The Sword in the Stone.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2693_The Sword in the Stone.json new file mode 100644 index 00000000..b6c9665f --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Ruby Sea/2693_The Sword in the Stone.json @@ -0,0 +1,178 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023357, + "Position": { + "X": 565.0873, + "Y": -62.272896, + "Z": -147.84473 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 566.1683, + "Y": -60.550995, + "Z": -134.80696 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1023358, + "Position": { + "X": 608.5145, + "Y": -3.4784377, + "Z": -92.82062 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 611.58606, + "Y": -1.6943853, + "Z": -91.26402 + }, + "TerritoryId": 613, + "InteractionType": "Jump", + "StopDistance": 0.25, + "JumpDestination": { + "Position": { + "X": 617.04565, + "Y": -17.818226, + "Z": -108.994415 + } + }, + "Mount": false + }, + { + "Position": { + "X": 617.01825, + "Y": -18.570948, + "Z": -114.45003 + }, + "TerritoryId": 613, + "InteractionType": "Jump", + "StopDistance": 0.25, + "JumpDestination": { + "Position": { + "X": 619.67755, + "Y": -28.768707, + "Z": -127.102554 + } + }, + "Mount": false + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 617.86127, + "Y": -29.12958, + "Z": -129.81326 + }, + "TerritoryId": 613, + "InteractionType": "Jump", + "StopDistance": 0.25, + "JumpDestination": { + "Position": { + "X": 604.2836, + "Y": -34.756268, + "Z": -136.64783 + } + }, + "Mount": false + }, + { + "Position": { + "X": 601.5953, + "Y": -36.643044, + "Z": -144.1365 + }, + "TerritoryId": 613, + "InteractionType": "Jump", + "StopDistance": 0.25, + "JumpDestination": { + "Position": { + "X": 598.6192, + "Y": -43.845043, + "Z": -154.23668 + } + }, + "Mount": false + }, + { + "Position": { + "X": 594.64703, + "Y": -43.869747, + "Z": -156.01822 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 593.3238, + "Y": -45.048393, + "Z": -152.89952 + }, + "TerritoryId": 613, + "InteractionType": "Jump", + "StopDistance": 0.25, + "JumpDestination": { + "Position": { + "X": 566.00684, + "Y": -61.995552, + "Z": -146.04814 + } + } + }, + { + "Position": { + "X": 566.1683, + "Y": -60.550995, + "Z": -134.80696 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "DataId": 1023358, + "Position": { + "X": 608.5145, + "Y": -3.4784377, + "Z": -92.82062 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2724_Something Smells.json b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2724_Something Smells.json new file mode 100644 index 00000000..7e6bc815 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2724_Something Smells.json @@ -0,0 +1,166 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019314, + "Position": { + "X": 421.77454, + "Y": -0.3000138, + "Z": -293.9651 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2008461, + "Position": { + "X": 474.2351, + "Y": 28.824219, + "Z": -212.23773 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002241, + "$": "? ? ? ? ? ? -> 1 80 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2008462, + "Position": { + "X": 569.6649, + "Y": 43.930664, + "Z": -145.22015 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002241, + "$": "1 80 0 0 0 128 -> 2 64 0 0 0 192", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2008463, + "Position": { + "X": 531.18164, + "Y": 85.40466, + "Z": -303.33417 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002241, + "$": "2 64 0 0 0 192 -> 3 48 0 0 0 224", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2008464, + "Position": { + "X": 537.8042, + "Y": 61.57019, + "Z": -10.269409 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002241, + "$": "3 48 0 0 0 224 -> 4 32 0 0 0 240", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 2008466, + "Position": { + "X": 487.0221, + "Y": 65.537476, + "Z": -23.361572 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002241, + "$": "4 32 0 0 0 240 -> 5 16 0 0 0 244", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 4 + ] + }, + { + "DataId": 2008465, + "Position": { + "X": 380.84985, + "Y": 41.031494, + "Z": -29.892456 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002241, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019314, + "Position": { + "X": 421.77454, + "Y": -0.3000138, + "Z": -293.9651 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2728_Fly, My Pretties.json b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2728_Fly, My Pretties.json new file mode 100644 index 00000000..7e269fef --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2728_Fly, My Pretties.json @@ -0,0 +1,181 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019263, + "Position": { + "X": 451.56018, + "Y": 58.77665, + "Z": -188.3421 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019264, + "Position": { + "X": 362.35596, + "Y": 90.70435, + "Z": -164.72119 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2008352, + "Position": { + "X": 379.23242, + "Y": 90.684326, + "Z": -134.72198 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 1 0 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2008354, + "Position": { + "X": 369.5276, + "Y": 97.61194, + "Z": -102.92212 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "$": "1 0 0 0 0 128 -> 2 0 0 0 0 160", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2008353, + "Position": { + "X": 352.34607, + "Y": 97.61194, + "Z": -134.99658 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1019264, + "Position": { + "X": 362.35596, + "Y": 90.70435, + "Z": -164.72119 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Mount": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2008355, + "Position": { + "X": 332.96704, + "Y": 100.87732, + "Z": -109.14783 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002213 + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1022071, + "Position": { + "X": 332.93652, + "Y": 100.91828, + "Z": -109.75824 + }, + "TerritoryId": 614, + "InteractionType": "Emote", + "Emote": "clap" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1019264, + "Position": { + "X": 362.35596, + "Y": 90.70435, + "Z": -164.72119 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019263, + "Position": { + "X": 451.56018, + "Y": 58.77665, + "Z": -188.3421 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2730_Whacking Day.json b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2730_Whacking Day.json new file mode 100644 index 00000000..0e9b7656 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2730_Whacking Day.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019313, + "Position": { + "X": 465.26282, + "Y": 58.52148, + "Z": -171.09949 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 151.29321, + "Y": -0.2997286, + "Z": 229.44983 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 6682, + "MinimumKillCount": 3, + "RewardItemId": 2002239, + "RewardItemCount": 3 + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019295, + "Position": { + "X": 756.3439, + "Y": 98.04659, + "Z": -229.93823 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yanxia - Namai" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2733_Wolves and Weeds.json b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2733_Wolves and Weeds.json new file mode 100644 index 00000000..065ade4e --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Aether Currents/Yanxia/2733_Wolves and Weeds.json @@ -0,0 +1,203 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019316, + "Position": { + "X": 434.89734, + "Y": 68.02076, + "Z": -125.01721 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022457, + "Position": { + "X": 529.56433, + "Y": 19.872318, + "Z": 350.24023 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2008007, + "Position": { + "X": 497.27625, + "Y": 16.342407, + "Z": 402.48718 + }, + "TerritoryId": 614, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818195 + }, + { + "Position": { + "X": 439.41403, + "Y": -0.3, + "Z": 464.3263 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "DisableNavmesh": true, + "Mount": true + }, + { + "DataId": 1022458, + "Position": { + "X": 210.95593, + "Y": 7.398857, + "Z": 500.26697 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7524, + 7525 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008518, + "Position": { + "X": 211.4137, + "Y": 8.255066, + "Z": 501.97595 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 439.41403, + "Y": -0.3, + "Z": 464.3263 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo" + }, + { + "DataId": 1022457, + "Position": { + "X": 529.56433, + "Y": 19.872318, + "Z": 350.24023 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": 605.15845, + "Y": -0.5999999, + "Z": 499.43237 + }, + "TerritoryId": 614, + "InteractionType": "Dive", + "StopDistance": 0.25 + }, + { + "DataId": 2008519, + "Position": { + "X": 619.8672, + "Y": -48.66101, + "Z": 559.83826 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "DisableNavmesh": true, + "Mount": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": 605.15845, + "Y": -0.5999999, + "Z": 499.43237 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "StopDistance": 0.25, + "DisableNavmesh": true, + "Mount": true + }, + { + "Position": { + "X": 617.7405, + "Y": -0.3, + "Z": 493.613 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "StopDistance": 0.25 + }, + { + "DataId": 1022457, + "Position": { + "X": 529.56433, + "Y": 19.872318, + "Z": 350.24023 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019316, + "Position": { + "X": 434.89734, + "Y": 68.02076, + "Z": -125.01721 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yanxia - Namai" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2446_Beyond the Great Wall.json b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2446_Beyond the Great Wall.json new file mode 100644 index 00000000..03d66d38 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2446_Beyond the Great Wall.json @@ -0,0 +1,130 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "TerritoryId": 156, + "DataId": 2002881, + "Position": { + "X": 21.133728, + "Y": 22.323914, + "Z": -631.281 + }, + "InteractionType": "Interact", + "TargetTerritoryId": 351, + "AetheryteShortcut": "Mor Dhona", + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 351 + ] + }, + "AetheryteShortcutIf": { + "InTerritory": [ + 351 + ] + } + } + }, + { + "DataId": 1018330, + "Position": { + "X": -4.196289, + "Y": 0.018040119, + "Z": -6.6377563 + }, + "TerritoryId": 351, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020284, + "Position": { + "X": -3.3112793, + "Y": 0.018040119, + "Z": -6.881897 + }, + "TerritoryId": 351, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020300, + "Position": { + "X": 24.795776, + "Y": 6.1891203, + "Z": 401.9989 + }, + "TerritoryId": 152, + "InteractionType": "Interact", + "Fly": true, + "AetheryteShortcut": "East Shroud - Hawthorne Hut" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020303, + "Position": { + "X": 26.962646, + "Y": 6.1844764, + "Z": 400.99182 + }, + "StopDistance": 7, + "TerritoryId": 152, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_STMBDA101_02446_WARP_YESNO_TITLE_001", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "TerritoryId": 612, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Fringes - Castrum Oriens" + }, + { + "Position": { + "X": -612.8515, + "Y": 130, + "Z": -506.81757 + }, + "TerritoryId": 612, + "InteractionType": "WalkTo" + }, + { + "DataId": 1020304, + "Position": { + "X": -606.7445, + "Y": 130, + "Z": -506.95053 + }, + "StopDistance": 7, + "TerritoryId": 612, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2447_Lyse Takes the Lead.json b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2447_Lyse Takes the Lead.json new file mode 100644 index 00000000..6086b187 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2447_Lyse Takes the Lead.json @@ -0,0 +1,135 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020527, + "Position": { + "X": -612.0852, + "Y": 130, + "Z": -504.02078 + }, + "StopDistance": 5, + "TerritoryId": 612, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020311, + "Position": { + "X": -481.2848, + "Y": 96.387344, + "Z": -341.26807 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007965, + "Position": { + "X": -487.26636, + "Y": 76.70703, + "Z": -249.56134 + }, + "TerritoryId": 612, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818133 + }, + { + "DataId": 1020316, + "Position": { + "X": -213.51953, + "Y": 59.159065, + "Z": -531.426 + }, + "TerritoryId": 612, + "InteractionType": "Interact", + "AetheryteShortcut": "Fringes - Castrum Oriens" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -124.70333, + "Y": 58.571022, + "Z": -581.12805 + }, + "TerritoryId": 612, + "InteractionType": "WalkTo" + }, + { + "DataId": 2007967, + "Position": { + "X": 155.84033, + "Y": 53.3302, + "Z": -499.44305 + }, + "TerritoryId": 612, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818135 + }, + { + "DataId": 1020321, + "Position": { + "X": 447.77588, + "Y": 61.497482, + "Z": -543.72473 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 484.6969, + "Y": 61.72069, + "Z": -558.6724 + }, + "TerritoryId": 612, + "InteractionType": "WalkTo", + "TargetTerritoryId": 635 + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020329, + "Position": { + "X": -32.974792, + "Y": 18.045086, + "Z": 129.41174 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2448_The Promise of a New Beginning.json b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2448_The Promise of a New Beginning.json new file mode 100644 index 00000000..52c79e01 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2448_The Promise of a New Beginning.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020329, + "Position": { + "X": -32.974792, + "Y": 18.045086, + "Z": 129.41174 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "TerritoryId": 635, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Rhalgr's Reach] Western Rhalgr's Reach" + }, + { + "TerritoryId": 635, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Rhalgr's Reach" + }, + { + "TerritoryId": 635, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Rhalgr's Reach] Northeastern Rhalgr's Reach" + }, + { + "DataId": 1019466, + "Position": { + "X": 170.91626, + "Y": 13.02367, + "Z": -91.38635 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2449_A Haven for the Bold.json b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2449_A Haven for the Bold.json new file mode 100644 index 00000000..91588abe --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2449_A Haven for the Bold.json @@ -0,0 +1,107 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020332, + "Position": { + "X": 164.90417, + "Y": 13.023668, + "Z": -91.50836 + }, + "StopDistance": 7, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020339, + "Position": { + "X": 95.2926, + "Y": 1.2333723, + "Z": -78.23309 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020345, + "Position": { + "X": -1.8463745, + "Y": 2.6970465, + "Z": -68.833435 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020346, + "Position": { + "X": -117.60132, + "Y": 0.5980477, + "Z": -65.812195 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020344, + "Position": { + "X": 86.65588, + "Y": 0, + "Z": 88.70068 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Rhalgr's Reach] Western Rhalgr's Reach", + "[Rhalgr's Reach] Aetheryte Plaza" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020347, + "Position": { + "X": 59.67798, + "Y": -8.1507994E-13, + "Z": -4.0742188 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2450_A Bargain Struck.json b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2450_A Bargain Struck.json new file mode 100644 index 00000000..06426f9d --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.0-Rhalgr's Reach 1/2450_A Bargain Struck.json @@ -0,0 +1,58 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020341, + "Position": { + "X": 61.17334, + "Y": -9.369123E-13, + "Z": -4.6845703 + }, + "StopDistance": 5, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019466, + "Position": { + "X": 170.91626, + "Y": 13.02367, + "Z": -91.38635 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020333, + "Position": { + "X": 164.14124, + "Y": 13.023669, + "Z": -92.30188 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2451_A Friend of a Friend in Need.json b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2451_A Friend of a Friend in Need.json new file mode 100644 index 00000000..74c9b97a --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2451_A Friend of a Friend in Need.json @@ -0,0 +1,103 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020337, + "Position": { + "X": 171.31299, + "Y": 13.02367, + "Z": -89.951965 + }, + "StopDistance": 7, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020395, + "Position": { + "X": -37.67456, + "Y": 18.448887, + "Z": 133.28748 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -30.398779, + "Y": 12.536386, + "Z": 167.62189 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "TargetTerritoryId": 612 + }, + { + "DataId": 1020498, + "Position": { + "X": 158.12915, + "Y": 49.714592, + "Z": -475.27277 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008157, + "Position": { + "X": 58.426758, + "Y": 51.895874, + "Z": -482.32245 + }, + "TerritoryId": 612, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7553, + 7554 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020351, + "Position": { + "X": -95.84198, + "Y": 59.801033, + "Z": -551.9341 + }, + "TerritoryId": 612, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2452_Signed, Sealed, to Be Delivered.json b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2452_Signed, Sealed, to Be Delivered.json new file mode 100644 index 00000000..2cc1dca0 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2452_Signed, Sealed, to Be Delivered.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020351, + "Position": { + "X": -95.84198, + "Y": 59.801033, + "Z": -551.9341 + }, + "TerritoryId": 612, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020353, + "Position": { + "X": -394.85773, + "Y": 105.037674, + "Z": -425.5589 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020304, + "Position": { + "X": -606.7445, + "Y": 130, + "Z": -506.95053 + }, + "TerritoryId": 612, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2453_Best Served with Cold Steel.json b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2453_Best Served with Cold Steel.json new file mode 100644 index 00000000..822d5bc0 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2453_Best Served with Cold Steel.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020304, + "Position": { + "X": -606.7445, + "Y": 130, + "Z": -506.95053 + }, + "TerritoryId": 612, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2007955, + "Position": { + "X": -228.22925, + "Y": 59.861084, + "Z": -409.5064 + }, + "TerritoryId": 612, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 8048, + 8049 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020503, + "Position": { + "X": -494.16345, + "Y": 82.14899, + "Z": -266.8651 + }, + "TerritoryId": 612, + "InteractionType": "SinglePlayerDuty", + "AetheryteShortcut": "Fringes - Castrum Oriens" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020361, + "Position": { + "X": -507.4388, + "Y": 86.34846, + "Z": -289.84515 + }, + "StopDistance": 5, + "TerritoryId": 612, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2454_Let Fill Your Hearts with Pride.json b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2454_Let Fill Your Hearts with Pride.json new file mode 100644 index 00000000..dc46fbb6 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.1-Peaks 1/2454_Let Fill Your Hearts with Pride.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020361, + "Position": { + "X": -507.4388, + "Y": 86.34846, + "Z": -289.84515 + }, + "StopDistance": 5, + "TerritoryId": 612, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020337, + "Position": { + "X": 171.31299, + "Y": 13.02367, + "Z": -89.951965 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "AethernetShortcut": [ + "[Rhalgr's Reach] Aetheryte Plaza", + "[Rhalgr's Reach] Northeastern Rhalgr's Reach" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2455_A Familiar Face Forgotten.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2455_A Familiar Face Forgotten.json new file mode 100644 index 00000000..f7342c49 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2455_A Familiar Face Forgotten.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020338, + "Position": { + "X": 170.30591, + "Y": 13.02367, + "Z": -93.06476 + }, + "StopDistance": 7, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020366, + "Position": { + "X": 114.18323, + "Y": 0.6520416, + "Z": -11.673218 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 132.8247, + "Y": -0.57445294, + "Z": -3.299387 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "TargetTerritoryId": 620 + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020368, + "Position": { + "X": -641.2604, + "Y": 50.867527, + "Z": -784.1764 + }, + "StopDistance": 7, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020370, + "Position": { + "X": -384.7563, + "Y": 52.201828, + "Z": -636.4691 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020372, + "Position": { + "X": 36.423218, + "Y": 117.95596, + "Z": -742.2446 + }, + "TerritoryId": 620, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2456_The Prodigal Daughter.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2456_The Prodigal Daughter.json new file mode 100644 index 00000000..dd5c736b --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2456_The Prodigal Daughter.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020372, + "Position": { + "X": 36.423218, + "Y": 117.95596, + "Z": -742.2446 + }, + "TerritoryId": 620, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "TerritoryId": 620, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Peaks - Ala Gannha" + }, + { + "DataId": 2007976, + "Position": { + "X": 202.86865, + "Y": 133.89783, + "Z": -753.1395 + }, + "TerritoryId": 620, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818149 + }, + { + "DataId": 1020841, + "Position": { + "X": 146.01355, + "Y": 118.1921, + "Z": -730.4951 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020374, + "Position": { + "X": 89.21948, + "Y": 119.4052, + "Z": -684.7792 + }, + "TerritoryId": 620, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2457_A Life More Ordinary.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2457_A Life More Ordinary.json new file mode 100644 index 00000000..191f0df9 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2457_A Life More Ordinary.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020376, + "Position": { + "X": 95.44519, + "Y": 118.15579, + "Z": -758.053 + }, + "TerritoryId": 620, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Peaks - Ala Gannha", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020375, + "Position": { + "X": 78.87378, + "Y": 118.26358, + "Z": -779.69025 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020374, + "Position": { + "X": 89.21948, + "Y": 119.4052, + "Z": -684.7792 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020379, + "Position": { + "X": 85.40466, + "Y": 118.15579, + "Z": -719.96643 + }, + "StopDistance": 5, + "TerritoryId": 620, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2458_The Color of Angry Qiqirn.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2458_The Color of Angry Qiqirn.json new file mode 100644 index 00000000..4538e36b --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2458_The Color of Angry Qiqirn.json @@ -0,0 +1,150 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020379, + "Position": { + "X": 85.40466, + "Y": 118.15579, + "Z": -719.96643 + }, + "StopDistance": 5, + "TerritoryId": 620, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Peaks - Ala Gannha", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -98.166626, + "Y": 104.979965, + "Z": -480.49606 + }, + "TerritoryId": 620, + "InteractionType": "WalkTo" + }, + { + "DataId": 2008681, + "Position": { + "X": -257.70966, + "Y": 102.311646, + "Z": -381.36877 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -281.2972, + "Y": 104.584076, + "Z": -359.10394 + }, + "TerritoryId": 620, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7514 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007978, + "Position": { + "X": -271.2597, + "Y": 157.91565, + "Z": -280.2625 + }, + "TerritoryId": 620, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818151 + }, + { + "Position": { + "X": -270.3264, + "Y": 202.14117, + "Z": -232.75537 + }, + "TerritoryId": 620, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": -270.3756, + "Y": 200.71988, + "Z": -237.96118 + }, + "TerritoryId": 620, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "Position": { + "X": -281.3983, + "Y": 200.71988, + "Z": -294.9439 + }, + "StopDistance": 0.25, + "TerritoryId": 620, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7555, + 8047 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020380, + "Position": { + "X": -281.5138, + "Y": 200.71988, + "Z": -294.0871 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020382, + "Position": { + "X": -284.596, + "Y": 200.71988, + "Z": -287.2511 + }, + "TerritoryId": 620, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2459_The Black Wolf's Pups.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2459_The Black Wolf's Pups.json new file mode 100644 index 00000000..cd75c329 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2459_The Black Wolf's Pups.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020382, + "Position": { + "X": -284.596, + "Y": 200.71988, + "Z": -287.2511 + }, + "TerritoryId": 620, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -281.5496, + "Y": 200.71988, + "Z": -258.17767 + }, + "TerritoryId": 620, + "InteractionType": "Jump", + "JumpDestination": { + "Position": { + "X": -281.22574, + "Y": 192.18245, + "Z": -239.78777 + } + } + }, + { + "DataId": 2008684, + "Position": { + "X": -200.4273, + "Y": 95.26196, + "Z": -448.23383 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020385, + "Position": { + "X": -111.711365, + "Y": 105.71431, + "Z": -364.065 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020387, + "Position": { + "X": -140.94757, + "Y": 104.16588, + "Z": -401.81586 + }, + "TerritoryId": 620, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2460_Homeward Bound.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2460_Homeward Bound.json new file mode 100644 index 00000000..9fb706c2 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2460_Homeward Bound.json @@ -0,0 +1,103 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020387, + "Position": { + "X": -140.94757, + "Y": 104.16588, + "Z": -401.81586 + }, + "TerritoryId": 620, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020841, + "Position": { + "X": 146.01355, + "Y": 118.1921, + "Z": -730.4951 + }, + "TerritoryId": 620, + "InteractionType": "Interact", + "AetheryteShortcut": "Peaks - Ala Gannha" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020511, + "Position": { + "X": 143.81628, + "Y": 118.1921, + "Z": -732.93665 + }, + "StopDistance": 5, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020512, + "Position": { + "X": 35.080444, + "Y": 117.831955, + "Z": -728.0537 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 165.07161, + "Y": 13.02367, + "Z": -91.94302 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Rhalgr's Reach", + "AethernetShortcut": [ + "[Rhalgr's Reach] Aetheryte Plaza", + "[Rhalgr's Reach] Northeastern Rhalgr's Reach" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1020338, + "Position": { + "X": 170.30591, + "Y": 13.02367, + "Z": -93.06476 + }, + "StopDistance": 7, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2954_Hard Country.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2954_Hard Country.json new file mode 100644 index 00000000..5b8fffc7 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2954_Hard Country.json @@ -0,0 +1,84 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020842, + "Position": { + "X": 81.55945, + "Y": 118.15579, + "Z": -717.89124 + }, + "TerritoryId": 620, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Peaks - Ala Gannha", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -53.208252, + "Y": 104.518814, + "Z": -739.1928 + }, + "TerritoryId": 620, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 7447, + "MinimumKillCount": 1, + "RewardItemId": 2002391, + "RewardItemCount": 1 + } + ] + }, + { + "Position": { + "X": -476.92078, + "Y": 48.885674, + "Z": -732.2957 + }, + "TerritoryId": 620, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 7450, + "MinimumKillCount": 1, + "RewardItemId": 2002392, + "RewardItemCount": 1 + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020842, + "Position": { + "X": 81.55945, + "Y": 118.15579, + "Z": -717.89124 + }, + "TerritoryId": 620, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Peaks - Ala Gannha" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2955_Death by a Thousand Rocks.json b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2955_Death by a Thousand Rocks.json new file mode 100644 index 00000000..2f754049 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.2-Fringes 1/2955_Death by a Thousand Rocks.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020848, + "Position": { + "X": 113.725464, + "Y": 118.15579, + "Z": -715.6634 + }, + "TerritoryId": 620, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Peaks - Ala Gannha", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020857, + "Position": { + "X": -768.91736, + "Y": 81.467896, + "Z": -300.8011 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2008680, + "Position": { + "X": -763.97345, + "Y": 81.89514, + "Z": -298.3902 + }, + "TerritoryId": 620, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020848, + "Position": { + "X": 113.725464, + "Y": 118.15579, + "Z": -715.6634 + }, + "TerritoryId": 620, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Peaks - Ala Gannha" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2461_Where Men Go as One.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2461_Where Men Go as One.json new file mode 100644 index 00000000..25a91e36 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2461_Where Men Go as One.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019466, + "Position": { + "X": 170.91626, + "Y": 13.02367, + "Z": -91.38635 + }, + "StopDistance": 7, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020390, + "Position": { + "X": 164.2633, + "Y": 13.02367, + "Z": -88.91437 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2462_Crossing the Velodyna.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2462_Crossing the Velodyna.json new file mode 100644 index 00000000..766f205c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2462_Crossing the Velodyna.json @@ -0,0 +1,103 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020332, + "Position": { + "X": 164.90417, + "Y": 13.023668, + "Z": -91.50836 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020342, + "Position": { + "X": -137.86536, + "Y": 0.59805053, + "Z": -80.27777 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Rhalgr's Reach] Northeastern Rhalgr's Reach", + "[Rhalgr's Reach] Western Rhalgr's Reach" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020324, + "Position": { + "X": -35.90454, + "Y": 18.50759, + "Z": 134.14197 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -611.21484, + "Y": 130, + "Z": -503.3509 + }, + "TerritoryId": 612, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Fringes - Castrum Oriens" + }, + { + "DataId": 1020304, + "Position": { + "X": -606.7445, + "Y": 130, + "Z": -506.95053 + }, + "StopDistance": 7, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020526, + "Position": { + "X": -609.6132, + "Y": 130, + "Z": -501.12158 + }, + "StopDistance": 5, + "TerritoryId": 612, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2463_In Crimson It Began.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2463_In Crimson It Began.json new file mode 100644 index 00000000..378e9373 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2463_In Crimson It Began.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020354, + "Position": { + "X": -605.2186, + "Y": 130, + "Z": -506.2486 + }, + "TerritoryId": 612, + "InteractionType": "AcceptQuest", + "StopDistance": 7, + "AetheryteShortcut": "Fringes - Castrum Oriens", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020399, + "Position": { + "X": -115.80072, + "Y": 40.833466, + "Z": -37.766113 + }, + "TerritoryId": 612, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020400, + "Position": { + "X": 71.30542, + "Y": 0.024691548, + "Z": -75.76111 + }, + "StopDistance": 5, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2464_The Fires Fade.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2464_The Fires Fade.json new file mode 100644 index 00000000..da0c7226 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2464_The Fires Fade.json @@ -0,0 +1,77 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020400, + "Position": { + "X": 71.30542, + "Y": 0.024691548, + "Z": -75.76111 + }, + "StopDistance": 5, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020411, + "Position": { + "X": 50.644653, + "Y": 0, + "Z": 3.0975342 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 2.6558871, + "Y": -2.1714334, + "Z": -3.1224606 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "Position": { + "X": -29.991734, + "Y": -0.5866744, + "Z": -14.3459 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo" + }, + { + "DataId": 1020416, + "Position": { + "X": -135.82056, + "Y": 0.59805036, + "Z": -83.634705 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2465_Bereft of Hearth and Home.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2465_Bereft of Hearth and Home.json new file mode 100644 index 00000000..240721c7 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2465_Bereft of Hearth and Home.json @@ -0,0 +1,129 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020420, + "Position": { + "X": -139.63531, + "Y": 0.598051, + "Z": -81.498474 + }, + "StopDistance": 7, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019486, + "Position": { + "X": -116.746826, + "Y": 0.6342248, + "Z": -55.832825 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2008158, + "Position": { + "X": -110.21594, + "Y": 2.2735596, + "Z": -72.95343 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 => 1 16 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2008160, + "Position": { + "X": -133.25708, + "Y": 1.8463135, + "Z": -56.595703 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "1 16 0 0 0 128 -> 2 32 0 0 0 160", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "Position": { + "X": -128.45901, + "Y": 0.59804773, + "Z": -52.17099 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "DataId": 2008159, + "Position": { + "X": -139.23859, + "Y": 1.9073486, + "Z": -33.707214 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020422, + "Position": { + "X": -85.923584, + "Y": -3.615388E-12, + "Z": -18.051514 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2466_Divide and Conquer.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2466_Divide and Conquer.json new file mode 100644 index 00000000..b82b0faa --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2466_Divide and Conquer.json @@ -0,0 +1,78 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020431, + "Position": { + "X": -91.233765, + "Y": -3.968323E-12, + "Z": -19.821533 + }, + "StopDistance": 5, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020400, + "Position": { + "X": 71.30542, + "Y": 0.024691548, + "Z": -75.76111 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Rhalgr's Reach] Western Rhalgr's Reach", + "[Rhalgr's Reach] Northeastern Rhalgr's Reach" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020432, + "Position": { + "X": -612.3904, + "Y": 130.1009, + "Z": -481.68158 + }, + "TerritoryId": 612, + "InteractionType": "Interact", + "AetheryteShortcut": "Fringes - Castrum Oriens" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020525, + "Position": { + "X": -610.2846, + "Y": 130, + "Z": -501.8845 + }, + "TerritoryId": 612, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2467_Lies, Damn Lies, and Pirates.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2467_Lies, Damn Lies, and Pirates.json new file mode 100644 index 00000000..d506cfda --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2467_Lies, Damn Lies, and Pirates.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020526, + "Position": { + "X": -609.6132, + "Y": 130, + "Z": -501.12158 + }, + "TerritoryId": 612, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Fringes - Castrum Oriens", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020434, + "Position": { + "X": 13.534729, + "Y": 43.999996, + "Z": -36.850586 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020434, + "Position": { + "X": 13.534729, + "Y": 43.999996, + "Z": -36.850586 + }, + "TerritoryId": 128, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2468_Tales from the Far East.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2468_Tales from the Far East.json new file mode 100644 index 00000000..9ffa0655 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2468_Tales from the Far East.json @@ -0,0 +1,135 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020434, + "Position": { + "X": 13.534729, + "Y": 43.999996, + "Z": -36.850586 + }, + "TerritoryId": 128, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020436, + "Position": { + "X": 40.57373, + "Y": 20.495369, + "Z": -648.73737 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "AetheryteShortcut": "Mor Dhona" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 156, + "DataId": 2002881, + "Position": { + "X": 21.133728, + "Y": 22.323914, + "Z": -631.281 + }, + "InteractionType": "Interact", + "TargetTerritoryId": 351 + }, + { + "DataId": 1020499, + "Position": { + "X": -7.7058716, + "Y": 0.009977884, + "Z": 6.881775 + }, + "TerritoryId": 351, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 1 0 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1020529, + "Position": { + "X": 6.6071167, + "Y": 0, + "Z": -8.46875 + }, + "TerritoryId": 351, + "InteractionType": "Interact", + "$": "1 0 0 0 0 128 -> 2 0 0 0 0 160", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1020528, + "Position": { + "X": 34.10388, + "Y": -1, + "Z": 1.4190674 + }, + "TerritoryId": 351, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 2002879, + "Position": { + "X": -0.015319824, + "Y": 2.9754639, + "Z": 27.481445 + }, + "TerritoryId": 351, + "InteractionType": "Interact", + "TargetTerritoryId": 156 + }, + { + "DataId": 1020436, + "Position": { + "X": 40.57373, + "Y": 20.495369, + "Z": -648.73737 + }, + "TerritoryId": 156, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2469_Not without Incident.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2469_Not without Incident.json new file mode 100644 index 00000000..31f911bf --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2469_Not without Incident.json @@ -0,0 +1,111 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020436, + "Position": { + "X": 40.57373, + "Y": 20.495369, + "Z": -648.73737 + }, + "TerritoryId": 156, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Mor Dhona", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020439, + "Position": { + "X": -355.55048, + "Y": 7.9999094, + "Z": 38.712036 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Arcanists' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020442, + "Position": { + "X": -357.65625, + "Y": 8.000015, + "Z": 45.822754 + }, + "StopDistance": 7, + "TerritoryId": 129, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_STMBDA139_02469_EVENTAREA_WARP_YESNO_TITLE", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020447, + "Position": { + "X": 5.0201416, + "Y": 21.347214, + "Z": -39.07837 + }, + "TerritoryId": 680, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "TerritoryId": 680, + "InteractionType": "Duty", + "ContentFinderConditionId": 238 + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020454, + "Position": { + "X": -123.09454, + "Y": -6.9999976, + "Z": -58.884644 + }, + "StopDistance": 5, + "TerritoryId": 628, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2635_Future Rust, Future Dust.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2635_Future Rust, Future Dust.json new file mode 100644 index 00000000..e0a4faba --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2635_Future Rust, Future Dust.json @@ -0,0 +1,174 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019470, + "Position": { + "X": 152.11719, + "Y": 13.1533165, + "Z": -118.48633 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019473, + "Position": { + "X": 51.285522, + "Y": 23.640764, + "Z": -288.96008 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "0 16 0 0 0 0 -> 1 16 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1019476, + "Position": { + "X": 77.25635, + "Y": 0, + "Z": -14.175659 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "AetheryteShortcut": "Rhalgr's Reach", + "$": "1 16 0 0 0 128 -> 2 16 0 0 0 160", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "Position": { + "X": 0.3239292, + "Y": -2.1258624, + "Z": 5.0789523 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + } + }, + { + "Position": { + "X": -42.27211, + "Y": -0.059376776, + "Z": -115.03399 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + } + }, + { + "DataId": 1019486, + "Position": { + "X": -116.746826, + "Y": 0.6342248, + "Z": -55.832825 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "2 16 0 0 0 160 -> 3 16 0 0 0 176", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 1019490, + "Position": { + "X": -6.240967, + "Y": -0.036807638, + "Z": -119.18823 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 79.89871, + "Y": -0.38368523, + "Z": -108.87432 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo" + }, + { + "DataId": 1019470, + "Position": { + "X": 152.11719, + "Y": 13.1533165, + "Z": -118.48633 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2636_A Dash of Green.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2636_A Dash of Green.json new file mode 100644 index 00000000..2757ce4e --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2636_A Dash of Green.json @@ -0,0 +1,169 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019476, + "Position": { + "X": 77.25635, + "Y": 0, + "Z": -14.175659 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019471, + "Position": { + "X": 149.49255, + "Y": 12.918162, + "Z": -137.07184 + }, + "TerritoryId": 635, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007954, + "Position": { + "X": 89.52466, + "Y": 0.5340576, + "Z": -96.23871 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "0 32 0 0 0 0 -> 1 48 0 0 0 16", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "Position": { + "X": 35.282135, + "Y": -2.2715392, + "Z": -115.13004 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + } + }, + { + "DataId": 2007951, + "Position": { + "X": 24.887451, + "Y": -0.3204956, + "Z": -119.85962 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2007953, + "Position": { + "X": -35.568848, + "Y": 9.262146, + "Z": 100.20593 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "AetheryteShortcut": "Rhalgr's Reach", + "$": "2 64 0 0 0 80 -> 3 80 0 0 0 112", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2007952, + "Position": { + "X": -33.40204, + "Y": -0.16790771, + "Z": -16.800232 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "1 48 0 0 0 16 -> 2 64 0 0 0 80", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 0.3266226, + "Y": -2.281856, + "Z": -3.879818 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "DataId": 1019476, + "Position": { + "X": 77.25635, + "Y": 0, + "Z": -14.175659 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2637_Ye Wayward Brothers.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2637_Ye Wayward Brothers.json new file mode 100644 index 00000000..c19ea6c2 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2637_Ye Wayward Brothers.json @@ -0,0 +1,155 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 0.3266226, + "Y": -2.281856, + "Z": -3.879818 + }, + "TerritoryId": 635, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "DataId": 1021167, + "Position": { + "X": -43.961243, + "Y": 0, + "Z": -15.030151 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021168, + "Position": { + "X": -160.38757, + "Y": -4.5343585, + "Z": -149.95044 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 1 0 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1021169, + "Position": { + "X": 19.485779, + "Y": -0.9195468, + "Z": 98.5885 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "1 0 0 0 0 128 -> 2 0 0 0 0 192", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1021171, + "Position": { + "X": 79.78931, + "Y": -0.19127949, + "Z": 56.809326 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "2 0 0 0 0 192 -> 3 0 0 0 0 208", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 1021170, + "Position": { + "X": 76.21875, + "Y": 0, + "Z": -12.466675 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "$": "3 0 0 0 0 208 -> 4 0 0 0 0 240", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1021172, + "Position": { + "X": 179.85803, + "Y": 13.567484, + "Z": -144.15204 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021167, + "Position": { + "X": -43.961243, + "Y": 0, + "Z": -15.030151 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Rhalgr's Reach] Northeastern Rhalgr's Reach", + "[Rhalgr's Reach] Western Rhalgr's Reach" + ] + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2638_Token of Faith.json b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2638_Token of Faith.json new file mode 100644 index 00000000..28020bdd --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A1.3-Rhalgr's Reach 2/2638_Token of Faith.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023298, + "Position": { + "X": 22.354431, + "Y": -0.33829167, + "Z": 3.7384033 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2008813, + "Position": { + "X": 143.5415, + "Y": 14.206055, + "Z": -164.72119 + }, + "TerritoryId": 635, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Rhalgr's Reach] Aetheryte Plaza", + "[Rhalgr's Reach] Northeastern Rhalgr's Reach" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1023638, + "Position": { + "X": 152.84961, + "Y": 13.097335, + "Z": -94.16345 + }, + "TerritoryId": 635, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2470_The Man from Ul'dah.json b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2470_The Man from Ul'dah.json new file mode 100644 index 00000000..18ae1d01 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2470_The Man from Ul'dah.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020450, + "Position": { + "X": -124.52893, + "Y": -6.9999976, + "Z": -55.832825 + }, + "StopDistance": 5, + "TerritoryId": 628, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020455, + "Position": { + "X": -63.34027, + "Y": -2.711526, + "Z": -58.396362 + }, + "StopDistance": 5, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] Shiokaze Hostelry" + }, + { + "TerritoryId": 628, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Kugane" + }, + { + "DataId": 1020460, + "Position": { + "X": 17.92926, + "Y": -1.5668043E-05, + "Z": -41.21466 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2471_Where the Streets Are Paved with Koban.json b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2471_Where the Streets Are Paved with Koban.json new file mode 100644 index 00000000..e997d2c7 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2471_Where the Streets Are Paved with Koban.json @@ -0,0 +1,77 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020460, + "Position": { + "X": 17.92926, + "Y": -1.5668043E-05, + "Z": -41.21466 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020461, + "Position": { + "X": 24.582275, + "Y": 4, + "Z": 68.28406 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] Kogane Dori Markets" + }, + { + "DataId": 1022359, + "Position": { + "X": 88.12085, + "Y": 4, + "Z": 69.7489 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020462, + "Position": { + "X": 95.140015, + "Y": 8.02, + "Z": 151.9646 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2472_By the Grace of Lord Lolorito.json b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2472_By the Grace of Lord Lolorito.json new file mode 100644 index 00000000..bc6f6073 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2472_By the Grace of Lord Lolorito.json @@ -0,0 +1,63 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020462, + "Position": { + "X": 95.140015, + "Y": 8.02, + "Z": 151.9646 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] The Ruby Bazaar" + }, + { + "DataId": 1020480, + "Position": { + "X": 150.80493, + "Y": 14.7757225, + "Z": 92.454346 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020465, + "Position": { + "X": 1.5411377, + "Y": 0, + "Z": -0.96136475 + }, + "StopDistance": 7, + "TerritoryId": 639, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2473_A Good Samurai Is Hard to Find.json b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2473_A Good Samurai Is Hard to Find.json new file mode 100644 index 00000000..2a683b4c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2473_A Good Samurai Is Hard to Find.json @@ -0,0 +1,233 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020465, + "Position": { + "X": 1.5411377, + "Y": 0, + "Z": -0.96136475 + }, + "StopDistance": 7, + "TerritoryId": 639, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022086, + "Position": { + "X": 142.47339, + "Y": 14.7757225, + "Z": 90.4707 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 142.47339, + "Y": 14.7757225, + "Z": 90.4707 + }, + "TerritoryId": 628, + "InteractionType": "UseItem", + "ItemId": 2002099 + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] Rakuza District", + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Aetheryte Plaza" + ] + }, + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] Bokairo Inn" + }, + { + "DataId": 1018982, + "Position": { + "X": -83.08539, + "Y": 18.05, + "Z": -191.14978 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1019002, + "Position": { + "X": -48.05072, + "Y": -2.9, + "Z": -50.247986 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Bokairo Inn", + "[Kugane] Shiokaze Hostelry" + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1020471, + "Position": { + "X": -81.83417, + "Y": -3, + "Z": 34.50061 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Shiokaze Hostelry", + "[Kugane] Kogane Dori Markets" + ], + "$": "? ? ? ? ? ? -> 16 16 16 0 0 32", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1020469, + "Position": { + "X": -108.50696, + "Y": -5.999997, + "Z": 72.098755 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "$": "16 16 16 0 0 32 -> 32 17 16 0 0 160", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1020470, + "Position": { + "X": -158.64807, + "Y": 4.000002, + "Z": 86.96118 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -132.33249, + "Y": 4.510561, + "Z": 117.53347 + }, + "StopDistance": 0.25, + "TerritoryId": 628, + "InteractionType": "Jump", + "JumpDestination": { + "Position": { + "X": -131.75923, + "Y": 6.245034, + "Z": 123.01645 + }, + "StopDistance": 0.5 + } + }, + { + "Position": { + "X": -125.70999, + "Y": 8.414458, + "Z": 123.2643 + }, + "TerritoryId": 628, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "Position": { + "X": -124.25544, + "Y": -4.999999, + "Z": 145.54941 + }, + "TerritoryId": 628, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] Pier #1", + "DisableNavmesh": true + }, + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] Thavnairian Consulate" + }, + { + "DataId": 1020472, + "Position": { + "X": -32.39496, + "Y": 0.029811792, + "Z": -68.3147 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Kugane] Thavnairian Consulate", + "[Kugane] Shiokaze Hostelry" + ] + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2474_It's Probably a Trap.json b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2474_It's Probably a Trap.json new file mode 100644 index 00000000..a5a7d30c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2474_It's Probably a Trap.json @@ -0,0 +1,132 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020472, + "Position": { + "X": -32.39496, + "Y": 0.029811792, + "Z": -68.3147 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020473, + "Position": { + "X": -34.65332, + "Y": 14.001162, + "Z": -46.616333 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019070, + "Position": { + "X": 151.20166, + "Y": 14.7757225, + "Z": 95.78088 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "TargetTerritoryId": 639, + "AethernetShortcut": [ + "[Kugane] Shiokaze Hostelry", + "[Kugane] The Ruby Bazaar" + ] + }, + { + "DataId": 1020465, + "Position": { + "X": 1.5411377, + "Y": 0, + "Z": -0.96136475 + }, + "TerritoryId": 639, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020468, + "Position": { + "X": -0.9309082, + "Y": 0.024139475, + "Z": -0.13739014 + }, + "TerritoryId": 639, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2008134, + "Position": { + "X": -0.015319824, + "Y": 1.1443481, + "Z": 13.504211 + }, + "TerritoryId": 639, + "InteractionType": "Interact", + "TargetTerritoryId": 628 + }, + { + "DataId": 1020475, + "Position": { + "X": -52.140076, + "Y": 16.75975, + "Z": -6.729248 + }, + "TerritoryId": 628, + "InteractionType": "SinglePlayerDuty", + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Kogane Dori Markets" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020476, + "Position": { + "X": 147.75305, + "Y": 14.775722, + "Z": 91.721924 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2475_Making the Catfish Sing.json b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2475_Making the Catfish Sing.json new file mode 100644 index 00000000..138f5594 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2475_Making the Catfish Sing.json @@ -0,0 +1,120 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020476, + "Position": { + "X": 147.75305, + "Y": 14.775722, + "Z": 91.721924 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1 + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020464, + "Position": { + "X": 0.045776367, + "Y": 0, + "Z": -2.3041382 + }, + "TerritoryId": 639, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008134, + "Position": { + "X": -0.015319824, + "Y": 1.1443481, + "Z": 13.504211 + }, + "TerritoryId": 639, + "InteractionType": "Interact", + "TargetTerritoryId": 628 + }, + { + "TerritoryId": 628, + "InteractionType": "AttuneAethernetShard", + "AethernetShard": "[Kugane] Sekiseigumi Barracks", + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Aetheryte Plaza" + ] + }, + { + "DataId": 1020481, + "Position": { + "X": 125.596924, + "Y": 14.804411, + "Z": -102.861084 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2007910, + "Position": { + "X": 125.322266, + "Y": 14.358704, + "Z": -100.48071 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2008333, + "Position": { + "X": 125.41394, + "Y": 14.358704, + "Z": -100.51117 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020483, + "Position": { + "X": 127.79431, + "Y": 14.650923, + "Z": -101.701416 + }, + "StopDistance": 7, + "TerritoryId": 628, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2476_Once More, to the Ruby Sea.json b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2476_Once More, to the Ruby Sea.json new file mode 100644 index 00000000..f57c09aa --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A2-Kugane/2476_Once More, to the Ruby Sea.json @@ -0,0 +1,90 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020484, + "Position": { + "X": 126.57361, + "Y": 14.054269, + "Z": -99.47363 + }, + "StopDistance": 7, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019070, + "Position": { + "X": 151.20166, + "Y": 14.7757225, + "Z": 95.78088 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "TargetTerritoryId": 639, + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] The Ruby Bazaar" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020485, + "Position": { + "X": -124.1322, + "Y": -6.999998, + "Z": -58.51837 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDA207_02476_Q1_000_000", + "Answer": "TEXT_STMBDA207_02476_A1_000_001" + } + ], + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Shiokaze Hostelry" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019891, + "Position": { + "X": 852.4147, + "Y": 5.923008, + "Z": 847.7759 + }, + "StopDistance": 7, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2477_Open Water.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2477_Open Water.json new file mode 100644 index 00000000..8c8d4af1 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2477_Open Water.json @@ -0,0 +1,76 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019891, + "Position": { + "X": 852.4147, + "Y": 5.923008, + "Z": 847.7759 + }, + "StopDistance": 7, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019893, + "Position": { + "X": 736.1714, + "Y": -0.600044, + "Z": 822.96484 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 594.744, + "Y": -0.41014904, + "Z": 835.82776 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1019896, + "Position": { + "X": 560.54016, + "Y": 0.44452444, + "Z": 828.21387 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019898, + "Position": { + "X": 464.5609, + "Y": 30.21226, + "Z": 791.53125 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2478_Boys with Boats.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2478_Boys with Boats.json new file mode 100644 index 00000000..80b91417 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2478_Boys with Boats.json @@ -0,0 +1,106 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019898, + "Position": { + "X": 464.5609, + "Y": 30.21226, + "Z": 791.53125 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2007995, + "Position": { + "X": 423.54468, + "Y": 15.823547, + "Z": 801.541 + }, + "TerritoryId": 613, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818178 + }, + { + "Position": { + "X": 375.51163, + "Y": 9.2976055, + "Z": 788.4051 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "DisableNavmesh": true, + "Mount": true + }, + { + "DataId": 2007848, + "Position": { + "X": 150.46924, + "Y": 1.2054443, + "Z": 551.9645 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019912, + "Position": { + "X": 116.105835, + "Y": -0.5, + "Z": 499.32092 + }, + "StopDistance": 7, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 377.86084, + "Y": 10.638865, + "Z": 792.4622 + }, + "StopDistance": 0.5, + "TerritoryId": 613, + "InteractionType": "Jump", + "JumpDestination": { + "Position": { + "X": 384.9748, + "Y": 14.661837, + "Z": 793.96063 + } + } + }, + { + "DataId": 1023650, + "Position": { + "X": 404.53186, + "Y": 19.5081, + "Z": 755.6113 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2479_To Bend with the Wind.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2479_To Bend with the Wind.json new file mode 100644 index 00000000..991de741 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2479_To Bend with the Wind.json @@ -0,0 +1,171 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023650, + "Position": { + "X": 404.53186, + "Y": 19.5081, + "Z": 755.6113 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1023683, + "Position": { + "X": 466.88025, + "Y": 30.398874, + "Z": 792.813 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 553.3004, + "Y": 0.94003797, + "Z": 833.7598 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1019915, + "Position": { + "X": 576.5315, + "Y": 0.94003797, + "Z": 849.3323 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDA303_02479_Q1_000_021", + "Answer": "TEXT_STMBDA303_02479_A1_000_022" + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1019919, + "Position": { + "X": -711.32983, + "Y": -0.10000001, + "Z": -301.83875 + }, + "StopDistance": 5, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1019923, + "Position": { + "X": -742.79395, + "Y": 2.129947, + "Z": -312.3064 + }, + "StopDistance": 5, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": -462.84192, + "Y": -0.3000002, + "Z": -533.4066 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1019925, + "Position": { + "X": -423.78882, + "Y": 3.201082, + "Z": -545.89154 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": -436.89062, + "Y": 1.4498298, + "Z": -547.5498 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 8029 + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1019928, + "Position": { + "X": -228.93109, + "Y": 0.39421302, + "Z": -530.44934 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019930, + "Position": { + "X": -58.335266, + "Y": 1.9963632, + "Z": -597.0703 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2480_Confederate Consternation.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2480_Confederate Consternation.json new file mode 100644 index 00000000..014e931b --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2480_Confederate Consternation.json @@ -0,0 +1,244 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019929, + "Position": { + "X": -57.724915, + "Y": 2.0040545, + "Z": -598.2605 + }, + "StopDistance": 5, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019931, + "Position": { + "X": 54.703613, + "Y": 2.4445753, + "Z": -595.4528 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 613, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Ruby Sea - Onokoro" + }, + { + "Position": { + "X": 20.867485, + "Y": 25.111027, + "Z": -634.323 + }, + "TerritoryId": 613, + "StopDistance": 0.25, + "InteractionType": "Jump", + "JumpDestination": { + "Position": { + "X": 20.556915, + "Y": 26.25455, + "Z": -633.04 + } + } + }, + { + "DataId": 2007999, + "Position": { + "X": 21.286316, + "Y": 24.002441, + "Z": -623.621 + }, + "TerritoryId": 613, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818182 + }, + { + "Position": { + "X": 20.3128, + "Y": 26.236794, + "Z": -629.7924 + }, + "TerritoryId": 613, + "InteractionType": "Jump", + "StopDistance": 0.25, + "Mount": true, + "JumpDestination": { + "Position": { + "X": 20.867485, + "Y": 25.111027, + "Z": -634.323 + } + } + }, + { + "DataId": 1021505, + "Position": { + "X": 79.42322, + "Y": 33.00897, + "Z": -669.9474 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1019938, + "Position": { + "X": 68.46716, + "Y": 25.007832, + "Z": -643.8239 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "Mount": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2007852, + "Position": { + "X": 109.17822, + "Y": 2.670288, + "Z": -619.95886 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 16 1 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "Position": { + "X": 28.796398, + "Y": 1.1177638, + "Z": -561.9825 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + } + }, + { + "DataId": 1021508, + "Position": { + "X": 13.565186, + "Y": 5.3493934, + "Z": -482.87177 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "$": "16 1 0 0 0 128 -> 33 1 0 0 0 160", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2007854, + "Position": { + "X": -107.74402, + "Y": 2.1209717, + "Z": -521.32446 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -61.59895, + "Y": 0.75750256, + "Z": -577.81134 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": 47.88596, + "Y": 2.0565174, + "Z": -591.9783 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": 47.516483, + "Y": 8.753822, + "Z": -612.76074 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "DataId": 1019939, + "Position": { + "X": 69.53528, + "Y": 25.007832, + "Z": -643.6713 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2481_Alisaie's Stones.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2481_Alisaie's Stones.json new file mode 100644 index 00000000..fbe35d07 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2481_Alisaie's Stones.json @@ -0,0 +1,143 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1021511, + "Position": { + "X": 31.3573, + "Y": 3.245383, + "Z": -602.74664 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2007911, + "Position": { + "X": 33.98181, + "Y": 4.1046753, + "Z": -603.87585 + }, + "StopDistance": 4, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007912, + "Position": { + "X": 138.10938, + "Y": 0.9613037, + "Z": -688.1666 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "KillEnemyDataIds": [ + 6676 + ], + "ItemId": 2002093, + "$": "0 2 0 0 0 0 -> 16 17 0 0 0 128" + }, + { + "DataId": 2007913, + "Position": { + "X": 256.21423, + "Y": -0.015319824, + "Z": -673.4874 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "KillEnemyDataIds": [ + 6676 + ], + "ItemId": 2002093 + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 446.98648, + "Y": 9.27001, + "Z": -657.7555 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 6618 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1019946, + "Position": { + "X": 449.39343, + "Y": 9.2068815, + "Z": -661.21924 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1019939, + "Position": { + "X": 69.53528, + "Y": 25.007832, + "Z": -643.6713 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "AetheryteShortcut": "Ruby Sea - Onokoro" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021505, + "Position": { + "X": 79.42322, + "Y": 33.00897, + "Z": -669.9474 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2482_Under the Sea.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2482_Under the Sea.json new file mode 100644 index 00000000..ff2d8b3d --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2482_Under the Sea.json @@ -0,0 +1,126 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1021505, + "Position": { + "X": 79.42322, + "Y": 33.00897, + "Z": -669.9474 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019951, + "Position": { + "X": 152.6665, + "Y": 1.1855946, + "Z": -500.3586 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 159.34975, + "Y": -0.60327315, + "Z": -494.75882 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "Position": { + "X": 529.52386, + "Y": -0.2066946, + "Z": -264.25665 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1019952, + "Position": { + "X": 732.63135, + "Y": 3.4147437, + "Z": -237.72034 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008002, + "Position": { + "X": 694.7584, + "Y": 1.9073486, + "Z": -53.48291 + }, + "TerritoryId": 613, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818185 + }, + { + "Position": { + "X": 637.34863, + "Y": 3.9160664, + "Z": -62.50255 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": 540.77136, + "Y": -64.228035, + "Z": -173.20897 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019956, + "Position": { + "X": 422.11023, + "Y": -98.96018, + "Z": -223.10223 + }, + "StopDistance": 5, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2483_Of Kojin and Kami.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2483_Of Kojin and Kami.json new file mode 100644 index 00000000..9a2e5bb7 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2483_Of Kojin and Kami.json @@ -0,0 +1,114 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019958, + "Position": { + "X": 420.34033, + "Y": -99.19678, + "Z": -221.36267 + }, + "StopDistance": 7, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019178, + "Position": { + "X": 319.69165, + "Y": -120.03494, + "Z": -250.90417 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019960, + "Position": { + "X": 321.3092, + "Y": -120.01774, + "Z": -248.2185 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "TerritoryId": 613, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Ruby Sea - Tamamizu" + }, + { + "Position": { + "X": 543.42303, + "Y": -61.394184, + "Z": -153.51427 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": 647.60547, + "Y": 3.3050807, + "Z": -55.93293 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": 664.2144, + "Y": 1.8086157, + "Z": -5.028036 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 6638, + "MinimumKillCount": 1, + "RewardItemId": 2002094, + "RewardItemCount": 1 + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019958, + "Position": { + "X": 420.34033, + "Y": -99.19678, + "Z": -221.36267 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ruby Sea - Tamamizu" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2484_In Soroban We Trust.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2484_In Soroban We Trust.json new file mode 100644 index 00000000..b3a2e566 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2484_In Soroban We Trust.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019958, + "Position": { + "X": 420.34033, + "Y": -99.19678, + "Z": -221.36267 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ruby Sea - Tamamizu", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019969, + "Position": { + "X": 322.56042, + "Y": -120.39043, + "Z": -300.5265 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 22.288645, + "Y": -196.2301, + "Z": -155.5739 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "$": "Sui-no-Sato, NE outside" + }, + { + "DataId": 1019970, + "Position": { + "X": 19.424683, + "Y": -197.53093, + "Z": -143.93835 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "Mount": false + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2485_Forever and Ever Apart.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2485_Forever and Ever Apart.json new file mode 100644 index 00000000..a2c32924 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2485_Forever and Ever Apart.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019970, + "Position": { + "X": 19.424683, + "Y": -197.53093, + "Z": -143.93835 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019197, + "Position": { + "X": -8.926575, + "Y": -187.08374, + "Z": -95.018005 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019971, + "Position": { + "X": 20.248657, + "Y": -197.56319, + "Z": -145.4032 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "Mount": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2486_In Darkness the Magatama Dreams.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2486_In Darkness the Magatama Dreams.json new file mode 100644 index 00000000..9b97dfe0 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2486_In Darkness the Magatama Dreams.json @@ -0,0 +1,95 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019971, + "Position": { + "X": 20.248657, + "Y": -197.56319, + "Z": -145.4032 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 21.067955, + "Y": -197.78902, + "Z": -155.23956 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "$": "Sui-no-Sato, NE inside" + }, + { + "DataId": 1019978, + "Position": { + "X": -227.86298, + "Y": -178.2102, + "Z": 185.74805 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -220.46619, + "Y": -193.02971, + "Z": 222.901 + }, + "TerritoryId": 613, + "InteractionType": "UseItem", + "StopDistance": 1, + "Fly": true, + "ItemId": 2002243 + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007920, + "Position": { + "X": -220.6607, + "Y": -192.49261, + "Z": 221.51514 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019978, + "Position": { + "X": -227.86298, + "Y": -178.2102, + "Z": 185.74805 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2487_The Whims of the Divine.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2487_The Whims of the Divine.json new file mode 100644 index 00000000..12ab0d5b --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2487_The Whims of the Divine.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019978, + "Position": { + "X": -227.86298, + "Y": -178.2102, + "Z": 185.74805 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "Mount": false + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019178, + "Position": { + "X": 319.69165, + "Y": -120.03494, + "Z": -250.90417 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "AetheryteShortcut": "Ruby Sea - Tamamizu" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019961, + "Position": { + "X": 323.0487, + "Y": -120.03495, + "Z": -249.01202 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2488_Breaking and Delivering.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2488_Breaking and Delivering.json new file mode 100644 index 00000000..9727c165 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2488_Breaking and Delivering.json @@ -0,0 +1,185 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019961, + "Position": { + "X": 323.0487, + "Y": -120.03495, + "Z": -249.01202 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDA312_02488_Q1_000_013", + "Answer": "TEXT_STMBDA312_02488_A1_000_014" + } + ], + "AetheryteShortcut": "Ruby Sea - Tamamizu", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 322.05746, + "Y": -121.20501, + "Z": -314.00232 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1019981, + "Position": { + "X": -470.81714, + "Y": -94.80432, + "Z": 191.85156 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -659.02277, + "Y": -21.210977, + "Z": 270.70654 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "Fly": true, + "StopDistance": 0.25 + }, + { + "Position": { + "X": -692.9208, + "Y": -0.3971126, + "Z": 261.18878 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": -721.99646, + "Y": 0.08899796, + "Z": 248.7757 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": -739.8565, + "Y": 4.6514797, + "Z": 233.82903 + }, + "StopDistance": 0.5, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7557, + 7558 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -701.18787, + "Y": 6.9741554, + "Z": 19.126472 + }, + "StopDistance": 0.5, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7559, + 8041, + 8042 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020624, + "Position": { + "X": -740.2304, + "Y": 8.312634, + "Z": 118.18103 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2008004, + "Position": { + "X": -805.7832, + "Y": 36.575806, + "Z": 235.18726 + }, + "TerritoryId": 613, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818187 + }, + { + "DataId": 1019983, + "Position": { + "X": -835.7214, + "Y": 51.33433, + "Z": 38.986816 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019985, + "Position": { + "X": -797.3602, + "Y": 48.41823, + "Z": 149.64526 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2489_The Lord of the Revel.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2489_The Lord of the Revel.json new file mode 100644 index 00000000..be1b52ee --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2489_The Lord of the Revel.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019985, + "Position": { + "X": -797.3602, + "Y": 48.41823, + "Z": 149.64526 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2007853, + "Position": { + "X": -838.9868, + "Y": 52.017944, + "Z": 38.010254 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 613, + "InteractionType": "Duty", + "ContentFinderConditionId": 243 + } + ] + }, + { + "Sequence": 3 + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -596.66895, + "Y": -45.822067, + "Z": -272.77194 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": -625.9836, + "Y": -0.5999986, + "Z": -278.578 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "DataId": 1019987, + "Position": { + "X": -727.657, + "Y": 0.3198316, + "Z": -316.88416 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019988, + "Position": { + "X": -761.83716, + "Y": 4.763445, + "Z": -455.2224 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2490_Tide Goes in, Imperials Go Out.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2490_Tide Goes in, Imperials Go Out.json new file mode 100644 index 00000000..a78c4ffa --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2490_Tide Goes in, Imperials Go Out.json @@ -0,0 +1,119 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019988, + "Position": { + "X": -761.83716, + "Y": 4.763445, + "Z": -455.2224 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019991, + "Position": { + "X": -807.3701, + "Y": 8.49827, + "Z": -418.87543 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 0 16 0 0 0 64", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -796.8525, + "Y": 8.05057, + "Z": -418.3381 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + } + }, + { + "DataId": 1019990, + "Position": { + "X": -794.6136, + "Y": 4.993313, + "Z": -372.67108 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "$": "0 16 0 0 0 64 -> 16 32 0 0 0 192", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], + "DisableNavmesh": true + }, + { + "DataId": 1019992, + "Position": { + "X": -791.2566, + "Y": 21.428185, + "Z": -480.24725 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019989, + "Position": { + "X": -761.83716, + "Y": 4.763445, + "Z": -453.4829 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2491_A Silence in Three Parts.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2491_A Silence in Three Parts.json new file mode 100644 index 00000000..07fe24aa --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2491_A Silence in Three Parts.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020186, + "Position": { + "X": -761.7761, + "Y": 4.763445, + "Z": -460.01373 + }, + "StopDistance": 5, + "TerritoryId": 613, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -831.06116, + "Y": 20.168653, + "Z": -266.25217 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "TargetTerritoryId": 614 + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019994, + "Position": { + "X": 790.4325, + "Y": 99.489136, + "Z": -290.8523 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019997, + "Position": { + "X": 527.9164, + "Y": 43.697002, + "Z": -156.05408 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2679_The Last Voyage.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2679_The Last Voyage.json new file mode 100644 index 00000000..15705b45 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2679_The Last Voyage.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1021509, + "Position": { + "X": 107.80493, + "Y": 0.80715245, + "Z": -574.548 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2008475, + "Position": { + "X": -103.01367, + "Y": 2.2124634, + "Z": -856.199 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022401, + "Position": { + "X": -158.89221, + "Y": -0.5, + "Z": -898.0087 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021509, + "Position": { + "X": 107.80493, + "Y": 0.80715245, + "Z": -574.548 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2681_The Solace of the Sea.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2681_The Solace of the Sea.json new file mode 100644 index 00000000..87c8e4e0 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2681_The Solace of the Sea.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1021517, + "Position": { + "X": 85.09949, + "Y": 41.112656, + "Z": -717.89124 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021513, + "Position": { + "X": 41.000854, + "Y": 21.22528, + "Z": -634.0276 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 97.741745, + "Y": 0.95900655, + "Z": -790.4652 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo" + }, + { + "DataId": 1022959, + "Position": { + "X": 88.36499, + "Y": 5.006782, + "Z": -862.3331 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021517, + "Position": { + "X": 85.09949, + "Y": 41.112656, + "Z": -717.89124 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2953_The Arrows of Misfortune.json b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2953_The Arrows of Misfortune.json new file mode 100644 index 00000000..84d1d3f5 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.1-Ruby Sea/2953_The Arrows of Misfortune.json @@ -0,0 +1,101 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 52.668243, + "Y": 4.323245, + "Z": -600.21014 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1021507, + "Position": { + "X": 57.236572, + "Y": 1.575162, + "Z": -578.24066 + }, + "TerritoryId": 613, + "InteractionType": "AcceptQuest", + "DisableNavmesh": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -371.42313, + "Y": 3.2183487, + "Z": -537.3274 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 8029 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1023682, + "Position": { + "X": -367.9713, + "Y": 3.3707767, + "Z": -534.4778 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1023682, + "Position": { + "X": -367.9713, + "Y": 3.3707767, + "Z": -534.4778 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021507, + "Position": { + "X": 57.236572, + "Y": 1.575162, + "Z": -578.24066 + }, + "TerritoryId": 613, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ruby Sea - Onokoro" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2492_Life after Doma.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2492_Life after Doma.json new file mode 100644 index 00000000..67d15aaa --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2492_Life after Doma.json @@ -0,0 +1,117 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019997, + "Position": { + "X": 527.9164, + "Y": 43.697002, + "Z": -156.05408 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2007834, + "Position": { + "X": 487.0526, + "Y": 50.461548, + "Z": -115.03784 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020000, + "Position": { + "X": 507.95752, + "Y": 41.742855, + "Z": -94.5907 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "TerritoryId": 614, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Yanxia - Namai" + }, + { + "DataId": 1020016, + "Position": { + "X": 414.51123, + "Y": -0.30000687, + "Z": -276.56976 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 406.34747, + "Y": -0.6000004, + "Z": -281.95883 + }, + "TerritoryId": 614, + "InteractionType": "Dive", + "StopDistance": 0.25 + }, + { + "Position": { + "X": 365.84177, + "Y": -50.164906, + "Z": -309.3022 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "Position": { + "X": 301.059, + "Y": -21.410977, + "Z": -358.57938 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true, + "StopDistance": 0.25 + }, + { + "DataId": 1020007, + "Position": { + "X": 277.9735, + "Y": 3.2627518, + "Z": -378.95782 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2493_The Stubborn Remainder.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2493_The Stubborn Remainder.json new file mode 100644 index 00000000..2fd01521 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2493_The Stubborn Remainder.json @@ -0,0 +1,140 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020011, + "Position": { + "X": -49.881836, + "Y": -0.26051223, + "Z": -12.893921 + }, + "TerritoryId": 681, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020012, + "Position": { + "X": 486.9917, + "Y": 50.48013, + "Z": -115.40399 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "AetheryteShortcut": "Yanxia - Namai" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019263, + "Position": { + "X": 451.56018, + "Y": 58.77665, + "Z": -188.3421 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 17 0 0 0 0 64", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1022719, + "Position": { + "X": 434.22595, + "Y": 68.02851, + "Z": -65.171326 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "$": "17 0 0 0 0 64 -> 33 16 0 0 0 96", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDA317_02493_Q1_100_040", + "Answer": "TEXT_STMBDA317_02493_A1_102_040" + } + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1019259, + "Position": { + "X": 405.4779, + "Y": 67.4601, + "Z": -61.539734 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "$": "33 16 0 0 0 96 -> 49 17 0 0 0 112", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 1020015, + "Position": { + "X": 389.2423, + "Y": 72.07916, + "Z": -68.467285 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Mount": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020012, + "Position": { + "X": 486.9917, + "Y": 50.48013, + "Z": -115.40399 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2494_The Ones We Leave Behind.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2494_The Ones We Leave Behind.json new file mode 100644 index 00000000..c3549b73 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2494_The Ones We Leave Behind.json @@ -0,0 +1,137 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020012, + "Position": { + "X": 486.9917, + "Y": 50.48013, + "Z": -115.40399 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 508.4545, + "Y": 83.838875, + "Z": 98.54378 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7560 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020018, + "Position": { + "X": 507.86584, + "Y": 83.5696, + "Z": 94.92627 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007836, + "Position": { + "X": 370.01587, + "Y": 85.52673, + "Z": 32.48633 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 6685 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020018, + "Position": { + "X": 507.86584, + "Y": 83.5696, + "Z": 94.92627 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1020019, + "Position": { + "X": 208.8197, + "Y": 141.52237, + "Z": -28.82434 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 2008008, + "Position": { + "X": 163.5614, + "Y": 144.60962, + "Z": -11.917358 + }, + "TerritoryId": 614, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818196 + }, + { + "DataId": 1020020, + "Position": { + "X": 397.75684, + "Y": 72.835175, + "Z": -97.06268 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yanxia - Namai", + "Mount": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2495_A New Ruby Tithe.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2495_A New Ruby Tithe.json new file mode 100644 index 00000000..44420f7a --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2495_A New Ruby Tithe.json @@ -0,0 +1,172 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020020, + "Position": { + "X": 397.75684, + "Y": 72.835175, + "Z": -97.06268 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 417.0395, + "Y": 68.028534, + "Z": -109.489944 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "DataId": 2007838, + "Position": { + "X": 418.4176, + "Y": 68.0094, + "Z": -135.4544 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020022, + "Position": { + "X": 418.0514, + "Y": 68.0285, + "Z": -133.89801 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020024, + "Position": { + "X": 534.2335, + "Y": 84.80294, + "Z": 111.13135 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020282, + "Position": { + "X": 498.83264, + "Y": 78.04988, + "Z": 147.23425 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2007835, + "Position": { + "X": 535.2406, + "Y": 54.48987, + "Z": 237.04883 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1020025, + "Position": { + "X": 303.60876, + "Y": 16.701138, + "Z": 584.71045 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 2007915, + "Position": { + "X": 329.67102, + "Y": 32.97461, + "Z": 603.2959 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1020025, + "Position": { + "X": 303.60876, + "Y": 16.701138, + "Z": 584.71045 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020283, + "Position": { + "X": 406.27136, + "Y": 14.6418705, + "Z": 626.1234 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2496_The Will to Live.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2496_The Will to Live.json new file mode 100644 index 00000000..040ec25b --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2496_The Will to Live.json @@ -0,0 +1,184 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023780, + "Position": { + "X": 406.21033, + "Y": 14.6418705, + "Z": 625.9707 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2007839, + "Position": { + "X": 358.69373, + "Y": 22.659607, + "Z": 573.69336 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020042, + "Position": { + "X": 435.2329, + "Y": 14.64187, + "Z": 619.8672 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020045, + "Position": { + "X": 439.01733, + "Y": 14.6418705, + "Z": 624.0481 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + }, + { + "DataId": 1020044, + "Position": { + "X": 438.40686, + "Y": 14.6418705, + "Z": 622.21704 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + }, + { + "DataId": 1020043, + "Position": { + "X": 438.4375, + "Y": 14.6418705, + "Z": 620.35547 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020042, + "Position": { + "X": 435.2329, + "Y": 14.64187, + "Z": 619.8672 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "TerritoryId": 614, + "InteractionType": "EquipItem", + "ItemId": 20596 + }, + { + "TerritoryId": 614, + "InteractionType": "EquipItem", + "ItemId": 20597 + }, + { + "TerritoryId": 614, + "InteractionType": "EquipItem", + "ItemId": 20598 + }, + { + "TerritoryId": 614, + "InteractionType": "EquipItem", + "ItemId": 20599 + }, + { + "TerritoryId": 614, + "InteractionType": "EquipItem", + "ItemId": 20600 + }, + { + "DataId": 1020041, + "Position": { + "X": 446.73828, + "Y": 14.626371, + "Z": 705.0431 + }, + "TerritoryId": 614, + "InteractionType": "Emote", + "Emote": "imperialsalute", + "$": "0 0 0 0 0 0 -> 17 0 0 0 0 64" + }, + { + "DataId": 1020040, + "Position": { + "X": 436.14856, + "Y": 14.6418705, + "Z": 706.1721 + }, + "TerritoryId": 614, + "InteractionType": "Emote", + "Emote": "imperialsalute" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1020042, + "Position": { + "X": 435.2329, + "Y": 14.64187, + "Z": 619.8672 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020029, + "Position": { + "X": 457.69434, + "Y": 30.001902, + "Z": 764.187 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2497_Daughter of the Deep.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2497_Daughter of the Deep.json new file mode 100644 index 00000000..0ca80fb5 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2497_Daughter of the Deep.json @@ -0,0 +1,190 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020046, + "Position": { + "X": 455.95483, + "Y": 29.324865, + "Z": 759.6703 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "TerritoryId": 614, + "InteractionType": "EquipRecommended" + }, + { + "DataId": 2008011, + "Position": { + "X": 457.51123, + "Y": 32.36438, + "Z": 822.4154 + }, + "TerritoryId": 614, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818199 + }, + { + "DataId": 1020047, + "Position": { + "X": 433.9818, + "Y": 14.6418705, + "Z": 622.76636 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007840, + "Position": { + "X": 390.6156, + "Y": 14.633362, + "Z": 685.96924 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020049, + "Position": { + "X": 390.5547, + "Y": 14.64187, + "Z": 685.9387 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002070 + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1020048, + "Position": { + "X": 434.5006, + "Y": 14.6418705, + "Z": 624.567 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2007841, + "Position": { + "X": 485.37415, + "Y": 14.633362, + "Z": 742.97705 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1020050, + "Position": { + "X": 485.2522, + "Y": 14.641862, + "Z": 742.97705 + }, + "TerritoryId": 614, + "InteractionType": "UseItem", + "ItemId": 2002070 + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1020051, + "Position": { + "X": 232.56274, + "Y": 1.4025975, + "Z": 756.0996 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 406.34747, + "Y": -0.6000004, + "Z": -281.95883 + }, + "TerritoryId": 614, + "InteractionType": "Dive", + "StopDistance": 0.25, + "AetheryteShortcut": "Yanxia - Namai" + }, + { + "Position": { + "X": 365.84177, + "Y": -50.164906, + "Z": -309.3022 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "Position": { + "X": 301.059, + "Y": -21.410977, + "Z": -358.57938 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true, + "StopDistance": 0.25 + }, + { + "DataId": 1023787, + "Position": { + "X": 278.30933, + "Y": 2.9544957, + "Z": -378.43903 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2498_The Time between the Seconds.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2498_The Time between the Seconds.json new file mode 100644 index 00000000..95052575 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2498_The Time between the Seconds.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020055, + "Position": { + "X": -463.21814, + "Y": 1.2300053, + "Z": 535.6068 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2007842, + "Position": { + "X": -245.74658, + "Y": 16.922241, + "Z": 577.7217 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020056, + "Position": { + "X": -247.91339, + "Y": 16.932724, + "Z": 577.4165 + }, + "StopDistance": 7, + "TerritoryId": 614, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020057, + "Position": { + "X": 488.30383, + "Y": 7.396728, + "Z": 375.14294 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2499_All the Little Angels.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2499_All the Little Angels.json new file mode 100644 index 00000000..a458a5d6 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2499_All the Little Angels.json @@ -0,0 +1,134 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020059, + "Position": { + "X": 490.19604, + "Y": 8.442365, + "Z": 373.22034 + }, + "StopDistance": 7, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020062, + "Position": { + "X": 453.4828, + "Y": 57.1882, + "Z": -146.41034 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "AetheryteShortcut": "Yanxia - Namai" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020064, + "Position": { + "X": 443.2898, + "Y": 58.814686, + "Z": -172.90002 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 1 0 0 0 0 64", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1020063, + "Position": { + "X": 442.83203, + "Y": 58.859047, + "Z": -171.06891 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "$": "1 0 0 0 0 64 -> 2 0 0 0 0 192", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1020065, + "Position": { + "X": 459.25073, + "Y": 58.79123, + "Z": -187.42657 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Mount": true, + "$": "2 0 0 0 0 192 -> 3 0 0 0 0 224", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1020066, + "Position": { + "X": 445.5481, + "Y": 68.028534, + "Z": -73.56378 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020067, + "Position": { + "X": 446.67737, + "Y": 68.028534, + "Z": -74.47931 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2934_A Glimpse of Madness.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2934_A Glimpse of Madness.json new file mode 100644 index 00000000..3672ff6c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2934_A Glimpse of Madness.json @@ -0,0 +1,108 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020004, + "Position": { + "X": 276.35608, + "Y": 3.6584158, + "Z": -377.5235 + }, + "StopDistance": 5, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1 + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1020008, + "Position": { + "X": 5.996765, + "Y": -0.5066767, + "Z": 2.5177002 + }, + "TerritoryId": 681, + "InteractionType": "Interact", + "$": "0 0 0 0 0 0 -> 16 1 0 0 0 128", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1020010, + "Position": { + "X": -30.014526, + "Y": -0.24868584, + "Z": -2.822998 + }, + "TerritoryId": 681, + "InteractionType": "Interact", + "$": "16 1 0 0 0 128 -> 32 17 0 0 0 160", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1020009, + "Position": { + "X": -45.243042, + "Y": -0.2509899, + "Z": -31.845642 + }, + "TerritoryId": 681, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020011, + "Position": { + "X": -49.881836, + "Y": -0.26051223, + "Z": -12.893921 + }, + "TerritoryId": 681, + "InteractionType": "CompleteQuest", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDA325_02934_Q1_000_064", + "Answer": "TEXT_STMBDA325_02934_A1_000_065" + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2935_Path of No Return.json b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2935_Path of No Return.json new file mode 100644 index 00000000..807fdc0e --- /dev/null +++ b/QuestPaths/4.x - Stormblood/MSQ/A3.2-Yanxia/2935_Path of No Return.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1020052, + "Position": { + "X": -52.47583, + "Y": -0.2509899, + "Z": -25.742065 + }, + "StopDistance": 7, + "TerritoryId": 681, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1020053, + "Position": { + "X": 456.01575, + "Y": 41.2719, + "Z": -43.320435 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "AetheryteShortcut": "Yanxia - Namai" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 161.05653, + "Y": -0.299994, + "Z": 191.03581 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo" + }, + { + "DataId": 2008013, + "Position": { + "X": -97.428955, + "Y": 13.260071, + "Z": 563.714 + }, + "TerritoryId": 614, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818201 + }, + { + "DataId": 1020055, + "Position": { + "X": -463.21814, + "Y": 1.2300053, + "Z": 535.6068 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Unlocks/Misc/2920_Sights of Crimson and Dawn.json b/QuestPaths/4.x - Stormblood/Unlocks/Misc/2920_Sights of Crimson and Dawn.json new file mode 100644 index 00000000..bed34cba --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Unlocks/Misc/2920_Sights of Crimson and Dawn.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "JerryWester", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019464, + "Position": { + "X": -33.096924, + "Y": 7.9693108, + "Z": 95.109375 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Rhalgr's Reach", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/7.x - Dawntrail/Leves/BTN/L1770_All Stars.json b/QuestPaths/7.x - Dawntrail/Leves/BTN/L1770_All Stars.json new file mode 100644 index 00000000..293ab4d6 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Leves/BTN/L1770_All Stars.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 767.05066, + "Y": 24.645323, + "Z": -561.67883 + }, + "TerritoryId": 1188, + "InteractionType": "InitiateLeve", + "AetheryteShortcut": "Kozama'uka - Ok'hanu", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "TerritoryId": 1188, + "InteractionType": "None", + "RequiredGatheredItems": [ + { + "ItemId": 2003516, + "AlternativeItemId": 2003517, + "ItemCount": 999 + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Leves/BTN/L1779_New Start for the Cinderfield.json b/QuestPaths/7.x - Dawntrail/Leves/BTN/L1779_New Start for the Cinderfield.json new file mode 100644 index 00000000..d7abd609 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Leves/BTN/L1779_New Start for the Cinderfield.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 518.05945, + "Y": 19.47163, + "Z": -335.71478 + }, + "TerritoryId": 1189, + "InteractionType": "InitiateLeve", + "AetheryteShortcut": "Yak T'el - Iq Br'aax", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "TerritoryId": 1189, + "InteractionType": "None", + "RequiredGatheredItems": [ + { + "ItemId": 2003529, + "AlternativeItemId": 2003530, + "ItemCount": 999 + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Leves/MIN/L1785_Old and Bubbly.json b/QuestPaths/7.x - Dawntrail/Leves/MIN/L1785_Old and Bubbly.json new file mode 100644 index 00000000..e5f1f299 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Leves/MIN/L1785_Old and Bubbly.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 228.24704, + "Y": -91.93331, + "Z": -229.72751 + }, + "TerritoryId": 1187, + "InteractionType": "InitiateLeve", + "AetheryteShortcut": "Urqopacha - Wachunpelo", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "TerritoryId": 1187, + "InteractionType": "None", + "RequiredGatheredItems": [ + { + "ItemId": 2003539, + "AlternativeItemId": 2003540, + "ItemCount": 999 + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Leves/MIN/L1794_Vestiges of War.json b/QuestPaths/7.x - Dawntrail/Leves/MIN/L1794_Vestiges of War.json index ecbe236a..75e19368 100644 --- a/QuestPaths/7.x - Dawntrail/Leves/MIN/L1794_Vestiges of War.json +++ b/QuestPaths/7.x - Dawntrail/Leves/MIN/L1794_Vestiges of War.json @@ -30,8 +30,7 @@ "AlternativeItemId": 2003553, "ItemCount": 999 } - ], - "$.0": "41635 → 970" + ] } ] } diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 25d083b6..c8533fdf 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -110,6 +110,7 @@ "Combat", "UseItem", "EquipItem", + "EquipRecommended", "Say", "Emote", "Action", @@ -245,7 +246,8 @@ "ExtraCondition": { "type": "string", "enum": [ - "WakingSandsMainArea" + "WakingSandsMainArea", + "RisingStonesSolar" ] } }, @@ -713,7 +715,8 @@ "lookout", "kneel", "bow", - "uchiwasshoi" + "uchiwasshoi", + "clap" ] } } diff --git a/Questionable.Model/EExpansionVersion.cs b/Questionable.Model/EExpansionVersion.cs new file mode 100644 index 00000000..038d43ec --- /dev/null +++ b/Questionable.Model/EExpansionVersion.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +namespace Questionable.Model; + +public enum EExpansionVersion : byte +{ + ARealmReborn = 0, + Heavensward = 1, + Stormblood = 2, + Shadowbringers = 3, + Endwalker = 4, + Dawntrail = 5 +} + +public static class ExpansionData +{ + public static IReadOnlyDictionary ExpansionFolders = + new Dictionary + { + { EExpansionVersion.ARealmReborn, "2.x - A Realm Reborn" }, + { EExpansionVersion.Heavensward, "3.x - Heavensward" }, + { EExpansionVersion.Stormblood, "4.x - Stormblood" }, + { EExpansionVersion.Shadowbringers, "5.x - Shadowbringers" }, + { EExpansionVersion.Endwalker, "6.x - Endwalker" }, + { EExpansionVersion.Dawntrail, "7.x - Dawntrail" } + }; +} diff --git a/Questionable.Model/ExpansionVersion.cs b/Questionable.Model/ExpansionVersion.cs deleted file mode 100644 index fe92f160..00000000 --- a/Questionable.Model/ExpansionVersion.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Generic; - -namespace Questionable.Model; - -public static class ExpansionData -{ - public static IReadOnlyDictionary ExpansionFolders = new Dictionary() - { - { 0, "2.x - A Realm Reborn" }, - { 1, "3.x - Heavensward" }, - { 2, "4.x - Stormblood" }, - { 3, "5.x - Shadowbringers" }, - { 4, "6.x - Endwalker" }, - { 5, "7.x - Dawntrail" } - }; -} diff --git a/Questionable.Model/Gathering/GatheringNode.cs b/Questionable.Model/Gathering/GatheringNode.cs index a88f53eb..d5bbce44 100644 --- a/Questionable.Model/Gathering/GatheringNode.cs +++ b/Questionable.Model/Gathering/GatheringNode.cs @@ -5,6 +5,7 @@ namespace Questionable.Model.Gathering; public sealed class GatheringNode { public uint DataId { get; set; } + public bool? Fly { get; set; } public List Locations { get; set; } = []; } diff --git a/Questionable.Model/Gathering/GatheringRoot.cs b/Questionable.Model/Gathering/GatheringRoot.cs index 9011f562..c76f45c7 100644 --- a/Questionable.Model/Gathering/GatheringRoot.cs +++ b/Questionable.Model/Gathering/GatheringRoot.cs @@ -16,5 +16,6 @@ public sealed class GatheringRoot public EAetheryteLocation? AetheryteShortcut { get; set; } public AethernetShortcut? AethernetShortcut { get; set; } + public bool? FlyBetweenNodes { get; set; } public List Groups { get; set; } = []; } diff --git a/Questionable.Model/GatheringMath.cs b/Questionable.Model/GatheringMath.cs index 86fca785..e7674a49 100644 --- a/Questionable.Model/GatheringMath.cs +++ b/Questionable.Model/GatheringMath.cs @@ -19,8 +19,9 @@ public static class GatheringMath degrees = Rng.Next(0, 360); float range = Rng.Next( - (int)(location.CalculateMinimumDistance() * 100), - (int)((location.CalculateMaximumDistance() - location.CalculateMinimumDistance()) * 100)) / 100f; + (int)(location.CalculateMinimumDistance() * 100), + (int)(location.CalculateMaximumDistance() * 100)) + / 100f; return (CalculateLandingLocation(location.Position, degrees, range), degrees, range); } diff --git a/Questionable.Model/Questing/Converter/EmoteConverter.cs b/Questionable.Model/Questing/Converter/EmoteConverter.cs index 5de1c5c5..28e102ee 100644 --- a/Questionable.Model/Questing/Converter/EmoteConverter.cs +++ b/Questionable.Model/Questing/Converter/EmoteConverter.cs @@ -30,5 +30,6 @@ public sealed class EmoteConverter() : EnumConverter(Values) { EEmote.Kneel, "kneel" }, { EEmote.Bow, "bow" }, { EEmote.Uchiwasshoi, "uchiwasshoi" }, + { EEmote.Clap, "clap" }, }; } diff --git a/Questionable.Model/Questing/Converter/InteractionTypeConverter.cs b/Questionable.Model/Questing/Converter/InteractionTypeConverter.cs index 2343676d..a7c81061 100644 --- a/Questionable.Model/Questing/Converter/InteractionTypeConverter.cs +++ b/Questionable.Model/Questing/Converter/InteractionTypeConverter.cs @@ -16,6 +16,7 @@ public sealed class InteractionTypeConverter() : EnumConverter { EInteractionType.Combat, "Combat" }, { EInteractionType.UseItem, "UseItem" }, { EInteractionType.EquipItem, "EquipItem" }, + { EInteractionType.EquipRecommended, "EquipRecommended" }, { EInteractionType.Say, "Say" }, { EInteractionType.Emote, "Emote" }, { EInteractionType.Action, "Action" }, diff --git a/Questionable.Model/Questing/Converter/SkipConditionConverter.cs b/Questionable.Model/Questing/Converter/SkipConditionConverter.cs index eadd84b1..4088446e 100644 --- a/Questionable.Model/Questing/Converter/SkipConditionConverter.cs +++ b/Questionable.Model/Questing/Converter/SkipConditionConverter.cs @@ -8,5 +8,6 @@ public sealed class SkipConditionConverter() : EnumConverter Values = new() { { EExtraSkipCondition.WakingSandsMainArea, "WakingSandsMainArea" }, + { EExtraSkipCondition.RisingStonesSolar, "RisingStonesSolar"}, }; } diff --git a/Questionable.Model/Questing/EEmote.cs b/Questionable.Model/Questing/EEmote.cs index c03be611..b5e825a3 100644 --- a/Questionable.Model/Questing/EEmote.cs +++ b/Questionable.Model/Questing/EEmote.cs @@ -31,4 +31,5 @@ public enum EEmote Kneel = 19, Bow = 5, Uchiwasshoi = 278, + Clap = 7, } diff --git a/Questionable.Model/Questing/EExtraSkipCondition.cs b/Questionable.Model/Questing/EExtraSkipCondition.cs index 3f2836a9..ddf29e9c 100644 --- a/Questionable.Model/Questing/EExtraSkipCondition.cs +++ b/Questionable.Model/Questing/EExtraSkipCondition.cs @@ -8,4 +8,6 @@ public enum EExtraSkipCondition { None, WakingSandsMainArea, + + RisingStonesSolar, } diff --git a/Questionable.Model/Questing/EInteractionType.cs b/Questionable.Model/Questing/EInteractionType.cs index 144861b7..4ad64815 100644 --- a/Questionable.Model/Questing/EInteractionType.cs +++ b/Questionable.Model/Questing/EInteractionType.cs @@ -15,6 +15,7 @@ public enum EInteractionType Combat, UseItem, EquipItem, + EquipRecommended, Say, Emote, Action, @@ -35,4 +36,7 @@ public enum EInteractionType AcceptLeve, InitiateLeve, CompleteLeve, + + // unmapped extra types below + InternalGather, } diff --git a/Questionable/Configuration.cs b/Questionable/Configuration.cs index 4424db23..2e833995 100644 --- a/Questionable/Configuration.cs +++ b/Questionable/Configuration.cs @@ -14,7 +14,6 @@ internal sealed class Configuration : IPluginConfiguration internal sealed class GeneralConfiguration { - public bool AutoAcceptNextQuest { get; set; } public uint MountId { get; set; } = 71; public GrandCompany GrandCompany { get; set; } = GrandCompany.None; public bool HideInAllInstances { get; set; } = true; diff --git a/Questionable/Controller/CommandHandler.cs b/Questionable/Controller/CommandHandler.cs index 322e6ccd..dbf8ade5 100644 --- a/Questionable/Controller/CommandHandler.cs +++ b/Questionable/Controller/CommandHandler.cs @@ -17,7 +17,6 @@ internal sealed class CommandHandler : IDisposable private readonly IChatGui _chatGui; private readonly QuestController _questController; private readonly MovementController _movementController; - private readonly QuickAccessButtonsComponent _quickAccessButtonsComponent; private readonly QuestRegistry _questRegistry; private readonly ConfigWindow _configWindow; private readonly DebugOverlay _debugOverlay; @@ -31,7 +30,6 @@ internal sealed class CommandHandler : IDisposable IChatGui chatGui, QuestController questController, MovementController movementController, - QuickAccessButtonsComponent quickAccessButtonsComponent, QuestRegistry questRegistry, ConfigWindow configWindow, DebugOverlay debugOverlay, @@ -44,7 +42,6 @@ internal sealed class CommandHandler : IDisposable _chatGui = chatGui; _questController = questController; _movementController = movementController; - _quickAccessButtonsComponent = quickAccessButtonsComponent; _questRegistry = questRegistry; _configWindow = configWindow; _debugOverlay = debugOverlay; @@ -78,7 +75,7 @@ internal sealed class CommandHandler : IDisposable case "start": _questWindow.IsOpen = true; - _questController.ExecuteNextStep(QuestController.EAutomationType.Automatic); + _questController.Start("Start command"); break; case "stop": @@ -87,7 +84,7 @@ internal sealed class CommandHandler : IDisposable break; case "reload": - _quickAccessButtonsComponent.Reload(); + _questWindow.Reload(); break; case "do": diff --git a/Questionable/Controller/ContextMenuController.cs b/Questionable/Controller/ContextMenuController.cs index bd7aef2d..3f65d097 100644 --- a/Questionable/Controller/ContextMenuController.cs +++ b/Questionable/Controller/ContextMenuController.cs @@ -146,7 +146,7 @@ internal sealed class ContextMenuController : IDisposable } ]; _questController.SetGatheringQuest(quest); - _questController.ExecuteNextStep(QuestController.EAutomationType.CurrentQuestOnly); + _questController.StartSingleQuest("SatisfactionSupply prepare gathering"); } else _chatGui.PrintError($"No associated quest ({info.QuestId}).", "Questionable"); diff --git a/Questionable/Controller/GameUiController.cs b/Questionable/Controller/GameUiController.cs index e57aef5f..4b366c7d 100644 --- a/Questionable/Controller/GameUiController.cs +++ b/Questionable/Controller/GameUiController.cs @@ -8,7 +8,6 @@ using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.Game.ClientState.Objects; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game.Event; -using FFXIVClientStructs.FFXIV.Client.Game.Object; using FFXIVClientStructs.FFXIV.Client.Game.UI; using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI.Agent; @@ -31,8 +30,8 @@ internal sealed class GameUiController : IDisposable { private readonly IAddonLifecycle _addonLifecycle; private readonly IDataManager _dataManager; - private readonly GameFunctions _gameFunctions; private readonly QuestFunctions _questFunctions; + private readonly AetheryteFunctions _aetheryteFunctions; private readonly ExcelFunctions _excelFunctions; private readonly QuestController _questController; private readonly QuestRegistry _questRegistry; @@ -46,8 +45,8 @@ internal sealed class GameUiController : IDisposable public GameUiController( IAddonLifecycle addonLifecycle, IDataManager dataManager, - GameFunctions gameFunctions, QuestFunctions questFunctions, + AetheryteFunctions aetheryteFunctions, ExcelFunctions excelFunctions, QuestController questController, QuestRegistry questRegistry, @@ -60,8 +59,8 @@ internal sealed class GameUiController : IDisposable { _addonLifecycle = addonLifecycle; _dataManager = dataManager; - _gameFunctions = gameFunctions; _questFunctions = questFunctions; + _aetheryteFunctions = aetheryteFunctions; _excelFunctions = excelFunctions; _questController = questController; _questRegistry = questRegistry; @@ -80,6 +79,7 @@ internal sealed class GameUiController : IDisposable _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CreditScroll", CreditScrollPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup); + _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CreditPlayer", CreditPlayerPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup); @@ -417,7 +417,7 @@ internal sealed class GameUiController : IDisposable return null; _questController.GatheringQuest.SetSequence(1); - _questController.ExecuteNextStep(QuestController.EAutomationType.CurrentQuestOnly); + _questController.StartSingleQuest("SatisfactionSupply turn in"); } return i; @@ -569,7 +569,7 @@ internal sealed class GameUiController : IDisposable private unsafe bool HandleTravelYesNo(AddonSelectYesno* addonSelectYesno, QuestController.QuestProgress currentQuest, string actualPrompt) { - if (_gameFunctions.ReturnRequestedAt >= DateTime.Now.AddSeconds(-2) && _returnRegex.IsMatch(actualPrompt)) + if (_aetheryteFunctions.ReturnRequestedAt >= DateTime.Now.AddSeconds(-2) && _returnRegex.IsMatch(actualPrompt)) { _logger.LogInformation("Automatically confirming return..."); addonSelectYesno->AtkUnitBase.FireCallbackInt(0); @@ -732,6 +732,13 @@ internal sealed class GameUiController : IDisposable addon->FireCallbackInt(-2); } + private unsafe void CreditPlayerPostSetup(AddonEvent type, AddonArgs args) + { + _logger.LogInformation("Closing CreditPlayer"); + AtkUnitBase* addon = (AtkUnitBase*)args.Addon; + addon->Close(true); + } + private unsafe void UnendingCodexPostSetup(AddonEvent type, AddonArgs args) { if (_questController.StartedQuest?.Quest.Id.Value == 4526) @@ -839,24 +846,43 @@ internal sealed class GameUiController : IDisposable _logger.LogInformation("Leve {Index} = {Id}, {Name}", i, questInfo.QuestId, questInfo.Name); */ - _framework.RunOnTick(() => - { - _questController.SetPendingQuest(nextQuest); - _questController.SetNextQuest(null); - - var agent = UIModule.Instance()->GetAgentModule()->GetAgentByInternalId(AgentId.LeveQuest); - var returnValue = stackalloc AtkValue[1]; - var selectQuest = stackalloc AtkValue[] - { - new() { Type = ValueType.Int, Int = 3 }, - new() { Type = ValueType.UInt, UInt = nextQuest.Quest.Id.Value } - }; - agent->ReceiveEvent(returnValue, selectQuest, 2, 0); - addon->Close(true); - }, TimeSpan.FromMilliseconds(100)); + _framework.RunOnTick(() => AcceptLeveOrWait(nextQuest), TimeSpan.FromMilliseconds(100)); } } + private unsafe void AcceptLeveOrWait(QuestController.QuestProgress nextQuest, int counter = 0) + { + var agent = UIModule.Instance()->GetAgentModule()->GetAgentByInternalId(AgentId.LeveQuest); + if (agent->IsAgentActive() && + _gameGui.TryGetAddonByName("GuildLeve", out AddonGuildLeve* addonGuildLeve) && + LAddon.IsAddonReady(&addonGuildLeve->AtkUnitBase) && + _gameGui.TryGetAddonByName("JournalDetail", out AtkUnitBase* addonJournalDetail) && + LAddon.IsAddonReady(addonJournalDetail)) + { + AcceptLeve(agent, addonGuildLeve, nextQuest); + } + else if (counter >= 10) + _logger.LogWarning("Unable to accept leve?"); + else + _framework.RunOnTick(() => AcceptLeveOrWait(nextQuest, counter + 1), TimeSpan.FromMilliseconds(100)); + } + + private unsafe void AcceptLeve(AgentInterface* agent, AddonGuildLeve* addon, + QuestController.QuestProgress nextQuest) + { + _questController.SetPendingQuest(nextQuest); + _questController.SetNextQuest(null); + + var returnValue = stackalloc AtkValue[1]; + var selectQuest = stackalloc AtkValue[] + { + new() { Type = ValueType.Int, Int = 3 }, + new() { Type = ValueType.UInt, UInt = nextQuest.Quest.Id.Value } + }; + agent->ReceiveEvent(returnValue, selectQuest, 2, 0); + addon->Close(true); + } + private StringOrRegex? ResolveReference(Quest? quest, string? excelSheet, ExcelRef? excelRef, bool isRegExp) { if (excelRef == null) @@ -880,6 +906,7 @@ internal sealed class GameUiController : IDisposable _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); + _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CreditPlayer", CreditPlayerPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CreditScroll", CreditScrollPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup); diff --git a/Questionable/Controller/GatheringController.cs b/Questionable/Controller/GatheringController.cs index 446c38c2..f5a517fa 100644 --- a/Questionable/Controller/GatheringController.cs +++ b/Questionable/Controller/GatheringController.cs @@ -1,13 +1,18 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Numerics; +using System.Text.RegularExpressions; using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects.Enums; +using Dalamud.Game.Text.SeStringHandling; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Event; using FFXIVClientStructs.FFXIV.Client.Game.UI; +using LLib; +using Lumina.Excel.GeneratedSheets; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Questionable.Controller.Steps; @@ -32,6 +37,7 @@ internal sealed unsafe class GatheringController : MiniTaskController logger, IServiceProvider serviceProvider, - ICondition condition) + ICondition condition, + IDataManager dataManager, + IPluginLog pluginLog) : base(chatGui, logger) { _movementController = movementController; @@ -54,6 +62,9 @@ internal sealed unsafe class GatheringController : MiniTaskController(5574, x => x.Text, pluginLog) + ?? throw new InvalidDataException("No regex found for revisit message"); } public bool Start(GatheringRequest gatheringRequest) @@ -88,13 +99,19 @@ internal sealed unsafe class GatheringController : MiniTaskController() .With(_currentRequest.Root.TerritoryId, MountTask.EMountIf.Always)); + + bool fly = currentNode.Fly.GetValueOrDefault(_currentRequest.Root.FlyBetweenNodes.GetValueOrDefault(true)) && + _gameFunctions.IsFlyingUnlocked(_currentRequest.Root.TerritoryId); if (currentNode.Locations.Count > 1) { Vector3 averagePosition = new Vector3 @@ -144,7 +164,7 @@ internal sealed unsafe class GatheringController : MiniTaskController x.Position.Y).Max() + 5f, Z = currentNode.Locations.Sum(x => x.Position.Z) / currentNode.Locations.Count, }; - bool fly = _gameFunctions.IsFlyingUnlocked(_currentRequest.Root.TerritoryId); + Vector3? pointOnFloor = _navmeshIpc.GetPointOnFloor(averagePosition, true); if (pointOnFloor != null) pointOnFloor = pointOnFloor.Value with { Y = pointOnFloor.Value.Y + (fly ? 3f : 0f) }; @@ -155,15 +175,19 @@ internal sealed unsafe class GatheringController : MiniTaskController() - .With(_currentRequest.Root.TerritoryId, currentNode)); + .With(_currentRequest.Root.TerritoryId, fly, currentNode)); _taskQueue.Enqueue(_serviceProvider.GetRequiredService() - .With(currentNode.DataId, null, EInteractionType.None, true)); - _taskQueue.Enqueue(_serviceProvider.GetRequiredService() - .With(_currentRequest.Data, currentNode)); - if (_currentRequest.Data.Collectability > 0) + .With(currentNode.DataId, null, EInteractionType.InternalGather, true)); + + foreach (bool revisitRequired in new[] { false, true }) { - _taskQueue.Enqueue(_serviceProvider.GetRequiredService() - .With(_currentRequest.Data, currentNode)); + _taskQueue.Enqueue(_serviceProvider.GetRequiredService() + .With(_currentRequest.Data, currentNode, revisitRequired)); + if (_currentRequest.Data.Collectability > 0) + { + _taskQueue.Enqueue(_serviceProvider.GetRequiredService() + .With(_currentRequest.Data, currentNode, revisitRequired)); + } } } @@ -197,8 +221,8 @@ internal sealed unsafe class GatheringController : MiniTaskController - _objectTable.FirstOrDefault(y => - currentNode.DataId == y.DataId && Vector3.Distance(x.Position, y.Position) < 0.1f)) + _objectTable.FirstOrDefault(y => + currentNode.DataId == y.DataId && Vector3.Distance(x.Position, y.Position) < 0.1f)) .ToList(); // Are any of the nodes too far away to be found? This is likely around ~100 yalms. All closer gathering @@ -229,6 +253,21 @@ internal sealed unsafe class GatheringController : MiniTaskController +internal sealed class QuestController : MiniTaskController, IDisposable { private readonly IClientState _clientState; private readonly GameFunctions _gameFunctions; @@ -27,6 +32,7 @@ internal sealed class QuestController : MiniTaskController private readonly QuestRegistry _questRegistry; private readonly IKeyState _keyState; private readonly ICondition _condition; + private readonly IToastGui _toastGui; private readonly Configuration _configuration; private readonly YesAlreadyIpc _yesAlreadyIpc; private readonly IReadOnlyList _taskFactories; @@ -64,6 +70,7 @@ internal sealed class QuestController : MiniTaskController IKeyState keyState, IChatGui chatGui, ICondition condition, + IToastGui toastGui, Configuration configuration, YesAlreadyIpc yesAlreadyIpc, IEnumerable taskFactories) @@ -78,9 +85,28 @@ internal sealed class QuestController : MiniTaskController _questRegistry = questRegistry; _keyState = keyState; _condition = condition; + _toastGui = toastGui; _configuration = configuration; _yesAlreadyIpc = yesAlreadyIpc; _taskFactories = taskFactories.ToList().AsReadOnly(); + + _condition.ConditionChange += OnConditionChange; + _toastGui.Toast += OnNormalToast; + _toastGui.ErrorToast += OnErrorToast; + } + + public EAutomationType AutomationType + { + get => _automationType; + set + { + if (value == _automationType) + return; + + _logger.LogInformation("Setting automation type to {NewAutomationType} (previous: {OldAutomationType})", + value, _automationType); + _automationType = value; + } } public (QuestProgress Progress, ECurrentQuestType Type)? CurrentQuestDetails @@ -175,7 +201,7 @@ internal sealed class QuestController : MiniTaskController if (CurrentQuest != null && CurrentQuest.Quest.Root.TerritoryBlacklist.Contains(_clientState.TerritoryType)) return; - if (_automationType == EAutomationType.Automatic && + if (AutomationType == EAutomationType.Automatic && ((_currentTask == null && _taskQueue.Count == 0) || _currentTask is WaitAtEnd.WaitQuestAccepted) && CurrentQuest is { Sequence: 0, Step: 0 } or { Sequence: 0, Step: 255 } @@ -187,7 +213,7 @@ internal sealed class QuestController : MiniTaskController CurrentQuest.SetStep(0); } - ExecuteNextStep(_automationType); + ExecuteNextStep(); return; } @@ -211,9 +237,10 @@ internal sealed class QuestController : MiniTaskController { _startedQuest = _pendingQuest; _pendingQuest = null; - Stop("Pending quest accepted", continueIfAutomatic: true); + CheckNextTasks("Pending quest accepted"); } } + if (_simulatedQuest == null && _nextQuest != null) { // if the quest is accepted, we no longer track it @@ -229,7 +256,7 @@ internal sealed class QuestController : MiniTaskController _nextQuest.Quest.Id); // if (_nextQuest.Quest.Id is LeveId) - // _startedQuest = _nextQuest; + // _startedQuest = _nextQuest; _nextQuest = null; } @@ -249,8 +276,8 @@ internal sealed class QuestController : MiniTaskController if (_nextQuest.Step == 0 && _currentTask == null && _taskQueue.Count == 0 && - _automationType == EAutomationType.Automatic) - ExecuteNextStep(_automationType); + AutomationType == EAutomationType.Automatic) + ExecuteNextStep(); } else if (_gatheringQuest != null) { @@ -259,8 +286,8 @@ internal sealed class QuestController : MiniTaskController if (_gatheringQuest.Step == 0 && _currentTask == null && _taskQueue.Count == 0 && - _automationType == EAutomationType.Automatic) - ExecuteNextStep(_automationType); + AutomationType == EAutomationType.Automatic) + ExecuteNextStep(); } else { @@ -283,12 +310,15 @@ internal sealed class QuestController : MiniTaskController _logger.LogInformation("New quest: {QuestName}", quest.Info.Name); _startedQuest = new QuestProgress(quest, currentSequence); - bool continueAutomatically = _configuration.General.AutoAcceptNextQuest; - - if (_clientState.LocalPlayer?.Level < quest.Info.Level) - continueAutomatically = false; - - Stop("Different Quest", continueAutomatically); + if (_clientState.LocalPlayer!.Level < quest.Info.Level) + { + _logger.LogInformation( + "Stopping automation, player level ({PlayerLevel}) < quest level ({QuestLevel}", + _clientState.LocalPlayer!.Level, quest.Info.Level); + Stop("Quest level too high"); + } + else + CheckNextTasks("Different Quest"); } else if (_startedQuest != null) { @@ -337,15 +367,15 @@ internal sealed class QuestController : MiniTaskController if (questToRun.Sequence != currentSequence) { questToRun.SetSequence(currentSequence); - Stop($"New sequence {questToRun == _startedQuest}/{_questFunctions.GetCurrentQuestInternal()}", - continueIfAutomatic: true); + CheckNextTasks( + $"New sequence {questToRun == _startedQuest}/{_questFunctions.GetCurrentQuestInternal()}"); } var q = questToRun.Quest; var sequence = q.FindSequence(questToRun.Sequence); if (sequence == null) { - DebugState = $"Sequence {sequence} not found"; + DebugState = $"Sequence {questToRun.Sequence} not found"; Stop("Unknown sequence"); return; } @@ -354,7 +384,7 @@ internal sealed class QuestController : MiniTaskController { DebugState = "Step completed"; if (_currentTask != null || _taskQueue.Count > 0) - Stop("Step complete", continueIfAutomatic: true); + CheckNextTasks("Step complete"); return; } @@ -418,8 +448,9 @@ internal sealed class QuestController : MiniTaskController CurrentQuest.SetStep(255); } - if (shouldContinue && _automationType != EAutomationType.Manual) - ExecuteNextStep(_automationType); + using var scope = _logger.BeginScope("IncStepCt"); + if (shouldContinue && AutomationType != EAutomationType.Manual) + ExecuteNextStep(); } private void ClearTasksInternal() @@ -435,33 +466,38 @@ internal sealed class QuestController : MiniTaskController _gatheringController.Stop("ClearTasksInternal"); } - public void Stop(string label, bool continueIfAutomatic) + public override void Stop(string label) { - using var scope = _logger.BeginScope(label); - - ClearTasksInternal(); - - // reset task queue - if (continueIfAutomatic && _automationType == EAutomationType.Automatic) - { - if (CurrentQuest?.Step is >= 0 and < 255) - ExecuteNextStep(_automationType); - else - _logger.LogInformation("Couldn't execute next step during Stop() call"); - - _lastTaskUpdate = DateTime.Now; - } - else if (_automationType != EAutomationType.Manual) + using var scope = _logger.BeginScope($"Stop/{label}"); + if (IsRunning || AutomationType != EAutomationType.Manual) { + ClearTasksInternal(); _logger.LogInformation("Stopping automatic questing"); - _automationType = EAutomationType.Manual; + AutomationType = EAutomationType.Manual; _nextQuest = null; _gatheringQuest = null; _lastTaskUpdate = DateTime.Now; } } - public override void Stop(string label) => Stop(label, false); + private void CheckNextTasks(string label) + { + if (AutomationType == EAutomationType.Automatic) + { + using var scope = _logger.BeginScope(label); + + ClearTasksInternal(); + + if (CurrentQuest?.Step is >= 0 and < 255) + ExecuteNextStep(); + else + _logger.LogInformation("Couldn't execute next step during Stop() call"); + + _lastTaskUpdate = DateTime.Now; + } + else + Stop(label); + } public void SimulateQuest(Quest? quest) { @@ -515,10 +551,30 @@ internal sealed class QuestController : MiniTaskController IncreaseStepCount(task.ElementId, task.Sequence, true); } - public void ExecuteNextStep(EAutomationType automatic) + public void Start(string label) + { + using var scope = _logger.BeginScope($"Q/{label}"); + AutomationType = EAutomationType.Automatic; + ExecuteNextStep(); + } + + public void StartSingleQuest(string label) + { + using var scope = _logger.BeginScope($"SQ/{label}"); + AutomationType = EAutomationType.CurrentQuestOnly; + ExecuteNextStep(); + } + + public void StartSingleStep(string label) + { + using var scope = _logger.BeginScope($"SS/{label}"); + AutomationType = EAutomationType.Manual; + ExecuteNextStep(); + } + + private void ExecuteNextStep() { ClearTasksInternal(); - _automationType = automatic; if (TryPickPriorityQuest()) _logger.LogInformation("Using priority quest over current quest"); @@ -691,34 +747,30 @@ internal sealed class QuestController : MiniTaskController return false; QuestSequence? currentSequence = currentQuest.Quest.FindSequence(currentQuest.Sequence); - QuestStep? currentStep = currentSequence?.FindStep(currentQuest.Step); + if (currentQuest.Step > 0) + return false; - // TODO Should this check that all previous steps have CompletionFlags so that we avoid running to places - // no longer relevant for the non-priority quest (after we're done with the priority quest)? + QuestStep? currentStep = currentSequence?.FindStep(currentQuest.Step); return currentStep?.AetheryteShortcut != null; } public bool TryPickPriorityQuest() { - if (!IsInterruptible()) + if (!IsInterruptible() || _nextQuest != null || _gatheringQuest != null || _simulatedQuest != null) return false; - ushort[] priorityQuests = - [ - 1157, // Garuda (Hard) - 1158, // Titan (Hard) - ]; + ElementId? priorityQuestId = _questFunctions.GetNextPriorityQuestThatCanBeAccepted(); + if (priorityQuestId == null) + return false; - foreach (var id in priorityQuests) + // don't start a second priority quest until the first one is resolved + if (_startedQuest != null && priorityQuestId == _startedQuest.Quest.Id) + return false; + + if (_questRegistry.TryGetQuest(priorityQuestId, out var quest)) { - var questId = new QuestId(id); - if (_questFunctions.IsReadyToAcceptQuest(questId) && _questRegistry.TryGetQuest(questId, out var quest)) - { - SetNextQuest(quest); - _chatGui.Print( - $"[Questionable] Picking up quest '{quest.Info.Name}' as a priority over current main story/side quests."); - return true; - } + SetNextQuest(quest); + return true; } return false; @@ -730,6 +782,36 @@ internal sealed class QuestController : MiniTaskController return IsRunning || DateTime.Now <= _lastTaskUpdate.Add(timeSpan); } + private void OnConditionChange(ConditionFlag flag, bool value) + { + if (_currentTask is IConditionChangeAware conditionChangeAware) + conditionChangeAware.OnConditionChange(flag, value); + } + + private void OnNormalToast(ref SeString message, ref ToastOptions options, ref bool isHandled) + { + _gatheringController.OnNormalToast(message); + } + + private void OnErrorToast(ref SeString message, ref bool isHandled) + { + if (_currentTask is IToastAware toastAware) + { + if (toastAware.OnErrorToast(message)) + { + isHandled = true; + return; + } + } + } + + public void Dispose() + { + _toastGui.ErrorToast -= OnErrorToast; + _toastGui.Toast -= OnNormalToast; + _condition.ConditionChange -= OnConditionChange; + } + public sealed record StepProgress( DateTime StartedAt, int PointMenuCounter = 0); diff --git a/Questionable/Controller/QuestRegistry.cs b/Questionable/Controller/QuestRegistry.cs index 713f5d7b..3ccd3ee3 100644 --- a/Questionable/Controller/QuestRegistry.cs +++ b/Questionable/Controller/QuestRegistry.cs @@ -8,6 +8,7 @@ using System.Text.Json; using System.Text.Json.Nodes; using Dalamud.Plugin; using Dalamud.Plugin.Ipc; +using LLib.GameData; using Microsoft.Extensions.Logging; using Questionable.Data; using Questionable.Model; @@ -203,4 +204,11 @@ internal sealed class QuestRegistry public bool TryGetQuest(ElementId questId, [NotNullWhen(true)] out Quest? quest) => _quests.TryGetValue(questId, out quest); + + public List GetKnownClassJobQuests(EClassJob classJob) + { + return _questData.GetClassJobQuests(classJob) + .Where(x => IsKnownQuest(x.QuestId)) + .ToList(); + } } diff --git a/Questionable/Controller/Steps/Gathering/DoGather.cs b/Questionable/Controller/Steps/Gathering/DoGather.cs index e947212c..6cd4b3e7 100644 --- a/Questionable/Controller/Steps/Gathering/DoGather.cs +++ b/Questionable/Controller/Steps/Gathering/DoGather.cs @@ -22,20 +22,24 @@ internal sealed class DoGather( IGameGui gameGui, IClientState clientState, ICondition condition, - ILogger logger) : ITask + ILogger logger) : ITask, IRevisitAware { private const uint StatusGatheringRateUp = 218; private GatheringController.GatheringRequest _currentRequest = null!; private GatheringNode _currentNode = null!; + private bool _revisitRequired; + private bool _revisitTriggered; private bool _wasGathering; private SlotInfo? _slotToGather; private Queue? _actionQueue; - public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode) + public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode, + bool revisitRequired) { _currentRequest = currentRequest; _currentNode = currentNode; + _revisitRequired = revisitRequired; return this; } @@ -43,8 +47,17 @@ internal sealed class DoGather( public unsafe ETaskResult Update() { - if (gatheringController.HasNodeDisappeared(_currentNode)) + if (_revisitRequired && !_revisitTriggered) + { + logger.LogInformation("No revisit"); return ETaskResult.TaskComplete; + } + + if (gatheringController.HasNodeDisappeared(_currentNode)) + { + logger.LogInformation("Node disappeared"); + return ETaskResult.TaskComplete; + } if (gameFunctions.GetFreeInventorySlots() == 0) throw new TaskException("Inventory full"); @@ -225,7 +238,12 @@ internal sealed class DoGather( return ActionManager.Instance()->GetActionStatus(ActionType.Action, (uint)action) == 0; } - public override string ToString() => "DoGather"; + public void OnRevisit() + { + _revisitTriggered = true; + } + + public override string ToString() => $"DoGather{(_revisitRequired ? " if revist" : "")}"; private sealed record SlotInfo(int Index, uint ItemId, int GatheringChance, int BoonChance, int Quantity); diff --git a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs index 63432931..10fb9faa 100644 --- a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs +++ b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs @@ -17,16 +17,19 @@ internal sealed class DoGatherCollectable( GameFunctions gameFunctions, IClientState clientState, IGameGui gameGui, - ILogger logger) : ITask + ILogger logger) : ITask, IRevisitAware { private GatheringController.GatheringRequest _currentRequest = null!; private GatheringNode _currentNode = null!; + private bool _revisitRequired; + private bool _revisitTriggered; private Queue? _actionQueue; - public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode) + public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode, bool revisitRequired) { _currentRequest = currentRequest; _currentNode = currentNode; + _revisitRequired = revisitRequired; return this; } @@ -34,8 +37,17 @@ internal sealed class DoGatherCollectable( public unsafe ETaskResult Update() { - if (gatheringController.HasNodeDisappeared(_currentNode)) + if (_revisitRequired && !_revisitTriggered) + { + logger.LogInformation("No revisit"); return ETaskResult.TaskComplete; + } + + if (gatheringController.HasNodeDisappeared(_currentNode)) + { + logger.LogInformation("Node disappeared"); + return ETaskResult.TaskComplete; + } if (gatheringController.HasRequestedItems()) { @@ -150,8 +162,13 @@ internal sealed class DoGatherCollectable( return botanistAction; } + public void OnRevisit() + { + _revisitTriggered = true; + } + public override string ToString() => - $"DoGatherCollectable({SeIconChar.Collectible.ToIconString()} {_currentRequest.Collectability})"; + $"DoGatherCollectable({SeIconChar.Collectible.ToIconString()} {_currentRequest.Collectability}){(_revisitRequired ? " if revist" : "")}"; [SuppressMessage("ReSharper", "NotAccessedPositionalProperty.Local")] private sealed record NodeCondition( diff --git a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs index ff27374e..84b9c888 100644 --- a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs +++ b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs @@ -20,12 +20,14 @@ internal sealed class MoveToLandingLocation( ILogger logger) : ITask { private ushort _territoryId; + private bool _flyBetweenNodes; private GatheringNode _gatheringNode = null!; private ITask _moveTask = null!; - public ITask With(ushort territoryId, GatheringNode gatheringNode) + public ITask With(ushort territoryId, bool flyBetweenNodes, GatheringNode gatheringNode) { _territoryId = territoryId; + _flyBetweenNodes = flyBetweenNodes; _gatheringNode = gatheringNode; return this; } @@ -47,7 +49,7 @@ internal sealed class MoveToLandingLocation( logger.LogInformation("Preliminary landing location: {Location}, with degrees = {Degrees}, range = {Range}", target.ToString("G", CultureInfo.InvariantCulture), degrees, range); - bool fly = gameFunctions.IsFlyingUnlocked(_territoryId); + bool fly = _flyBetweenNodes && gameFunctions.IsFlyingUnlocked(_territoryId); _moveTask = serviceProvider.GetRequiredService() .With(_territoryId, target, 0.25f, dataId: _gatheringNode.DataId, fly: fly, ignoreDistanceToObject: true); @@ -56,5 +58,5 @@ internal sealed class MoveToLandingLocation( public ETaskResult Update() => _moveTask.Update(); - public override string ToString() => $"Land/{_moveTask}"; + public override string ToString() => $"Land/{_moveTask}/{_flyBetweenNodes}"; } diff --git a/Questionable/Controller/Steps/IConditionChangeAware.cs b/Questionable/Controller/Steps/IConditionChangeAware.cs new file mode 100644 index 00000000..4e41d638 --- /dev/null +++ b/Questionable/Controller/Steps/IConditionChangeAware.cs @@ -0,0 +1,8 @@ +using Dalamud.Game.ClientState.Conditions; + +namespace Questionable.Controller.Steps; + +public interface IConditionChangeAware +{ + void OnConditionChange(ConditionFlag flag, bool value); +} diff --git a/Questionable/Controller/Steps/IRevisitAware.cs b/Questionable/Controller/Steps/IRevisitAware.cs new file mode 100644 index 00000000..4faf1c0b --- /dev/null +++ b/Questionable/Controller/Steps/IRevisitAware.cs @@ -0,0 +1,6 @@ +namespace Questionable.Controller.Steps; + +public interface IRevisitAware +{ + void OnRevisit(); +} diff --git a/Questionable/Controller/Steps/IToastAware.cs b/Questionable/Controller/Steps/IToastAware.cs new file mode 100644 index 00000000..67a1c7f6 --- /dev/null +++ b/Questionable/Controller/Steps/IToastAware.cs @@ -0,0 +1,8 @@ +using Dalamud.Game.Text.SeStringHandling; + +namespace Questionable.Controller.Steps; + +public interface IToastAware +{ + bool OnErrorToast(SeString message); +} diff --git a/Questionable/Controller/Steps/Interactions/AethernetShard.cs b/Questionable/Controller/Steps/Interactions/AethernetShard.cs index 741d92ab..c1e14010 100644 --- a/Questionable/Controller/Steps/Interactions/AethernetShard.cs +++ b/Questionable/Controller/Steps/Interactions/AethernetShard.cs @@ -25,7 +25,10 @@ internal static class AethernetShard } } - internal sealed class DoAttune(GameFunctions gameFunctions, ILogger logger) : ITask + internal sealed class DoAttune( + AetheryteFunctions aetheryteFunctions, + GameFunctions gameFunctions, + ILogger logger) : ITask { public EAetheryteLocation AetheryteLocation { get; set; } @@ -37,7 +40,7 @@ internal static class AethernetShard public bool Start() { - if (!gameFunctions.IsAetheryteUnlocked(AetheryteLocation)) + if (!aetheryteFunctions.IsAetheryteUnlocked(AetheryteLocation)) { logger.LogInformation("Attuning to aethernet shard {AethernetShard}", AetheryteLocation); gameFunctions.InteractWith((uint)AetheryteLocation, ObjectKind.Aetheryte); @@ -49,7 +52,7 @@ internal static class AethernetShard } public ETaskResult Update() => - gameFunctions.IsAetheryteUnlocked(AetheryteLocation) + aetheryteFunctions.IsAetheryteUnlocked(AetheryteLocation) ? ETaskResult.TaskComplete : ETaskResult.StillRunning; diff --git a/Questionable/Controller/Steps/Interactions/Aetheryte.cs b/Questionable/Controller/Steps/Interactions/Aetheryte.cs index c38d20ce..4a47b744 100644 --- a/Questionable/Controller/Steps/Interactions/Aetheryte.cs +++ b/Questionable/Controller/Steps/Interactions/Aetheryte.cs @@ -24,7 +24,10 @@ internal static class Aetheryte } } - internal sealed class DoAttune(GameFunctions gameFunctions, ILogger logger) : ITask + internal sealed class DoAttune( + AetheryteFunctions aetheryteFunctions, + GameFunctions gameFunctions, + ILogger logger) : ITask { public EAetheryteLocation AetheryteLocation { get; set; } @@ -36,7 +39,7 @@ internal static class Aetheryte public bool Start() { - if (!gameFunctions.IsAetheryteUnlocked(AetheryteLocation)) + if (!aetheryteFunctions.IsAetheryteUnlocked(AetheryteLocation)) { logger.LogInformation("Attuning to aetheryte {Aetheryte}", AetheryteLocation); gameFunctions.InteractWith((uint)AetheryteLocation); @@ -48,7 +51,7 @@ internal static class Aetheryte } public ETaskResult Update() => - gameFunctions.IsAetheryteUnlocked(AetheryteLocation) + aetheryteFunctions.IsAetheryteUnlocked(AetheryteLocation) ? ETaskResult.TaskComplete : ETaskResult.StillRunning; diff --git a/Questionable/Controller/Steps/Interactions/EquipItem.cs b/Questionable/Controller/Steps/Interactions/EquipItem.cs index 95aad266..84952fe7 100644 --- a/Questionable/Controller/Steps/Interactions/EquipItem.cs +++ b/Questionable/Controller/Steps/Interactions/EquipItem.cs @@ -1,11 +1,14 @@ using System; using System.Collections.Generic; using System.Linq; +using Dalamud.Game.Text.SeStringHandling; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; +using LLib; using Lumina.Excel.GeneratedSheets; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Questionable.Functions; using Questionable.Model.Questing; using Quest = Questionable.Model.Quest; @@ -26,8 +29,9 @@ internal static class EquipItem } } - internal sealed class DoEquip(IDataManager dataManager, ILogger logger) : ITask + internal sealed class DoEquip(IDataManager dataManager, ILogger logger) : ITask, IToastAware { + private const int MaxAttempts = 3; private static readonly IReadOnlyList SourceInventoryTypes = [ InventoryType.ArmoryMainHand, @@ -98,7 +102,7 @@ internal static class EquipItem private unsafe void Equip() { ++_attempts; - if (_attempts > 3) + if (_attempts > MaxAttempts) throw new TaskException("Unable to equip gear."); var inventoryManager = InventoryManager.Instance(); @@ -169,5 +173,14 @@ internal static class EquipItem } public override string ToString() => $"Equip({_item.Name})"; + + public bool OnErrorToast(SeString message) + { + string? insufficientArmoryChestSpace = dataManager.GetString(709, x => x.Text); + if (GameFunctions.GameStringEquals(message.TextValue, insufficientArmoryChestSpace)) + _attempts = MaxAttempts; + + return false; + } } } diff --git a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs new file mode 100644 index 00000000..26af42f1 --- /dev/null +++ b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs @@ -0,0 +1,50 @@ +using System; +using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.UI.Misc; +using Microsoft.Extensions.DependencyInjection; +using Questionable.Model; +using Questionable.Model.Questing; + +namespace Questionable.Controller.Steps.Interactions; + +internal static class EquipRecommended +{ + internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory + { + public ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step) + { + if (step.InteractionType != EInteractionType.EquipRecommended) + return null; + + return serviceProvider.GetRequiredService(); + } + } + + internal sealed unsafe class DoEquipRecommended(IClientState clientState) : ITask + { + private bool _equipped; + + public bool Start() + { + RecommendEquipModule.Instance()->SetupForClassJob((byte)clientState.LocalPlayer!.ClassJob.Id); + return true; + } + + public ETaskResult Update() + { + if (RecommendEquipModule.Instance()->IsUpdating) + return ETaskResult.StillRunning; + + if (!_equipped) + { + RecommendEquipModule.Instance()->EquipRecommendedGear(); + _equipped = true; + return ETaskResult.StillRunning; + } + + return ETaskResult.TaskComplete; + } + + public override string ToString() => "EquipRecommended"; + } +} diff --git a/Questionable/Controller/Steps/Interactions/Interact.cs b/Questionable/Controller/Steps/Interactions/Interact.cs index cb2b3d6c..dc50ac06 100644 --- a/Questionable/Controller/Steps/Interactions/Interact.cs +++ b/Questionable/Controller/Steps/Interactions/Interact.cs @@ -44,10 +44,10 @@ internal static class Interact } internal sealed class DoInteract(GameFunctions gameFunctions, ICondition condition, ILogger logger) - : ITask + : ITask, IConditionChangeAware { private bool _needsUnmount; - private bool _interacted; + private EInteractionState _interactionState = EInteractionState.None; private DateTime _continueAt = DateTime.MinValue; private uint DataId { get; set; } @@ -84,9 +84,11 @@ internal static class Interact return true; } - if (IsTargetable(gameObject) && HasAnyMarker(gameObject)) + if (gameObject.IsTargetable && HasAnyMarker(gameObject)) { - _interacted = gameFunctions.InteractWith(gameObject); + _interactionState = gameFunctions.InteractWith(gameObject) + ? EInteractionState.InteractionTriggered + : EInteractionState.None; _continueAt = DateTime.Now.AddSeconds(0.5); return true; } @@ -111,18 +113,21 @@ internal static class Interact _needsUnmount = false; } - if (!_interacted) - { - IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId); - if (gameObject == null || !IsTargetable(gameObject) || !HasAnyMarker(gameObject)) - return ETaskResult.StillRunning; + if (_interactionState == EInteractionState.InteractionConfirmed) + return ETaskResult.TaskComplete; - _interacted = gameFunctions.InteractWith(gameObject); - _continueAt = DateTime.Now.AddSeconds(0.5); + if (InteractionType == EInteractionType.InternalGather && condition[ConditionFlag.Gathering]) + return ETaskResult.TaskComplete; + + IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId); + if (gameObject == null || !gameObject.IsTargetable || !HasAnyMarker(gameObject)) return ETaskResult.StillRunning; - } - return ETaskResult.TaskComplete; + _interactionState = gameFunctions.InteractWith(gameObject) + ? EInteractionState.InteractionTriggered + : EInteractionState.None; + _continueAt = DateTime.Now.AddSeconds(0.5); + return ETaskResult.StillRunning; } private unsafe bool HasAnyMarker(IGameObject gameObject) @@ -134,11 +139,24 @@ internal static class Interact return gameObjectStruct->NamePlateIconId != 0; } - private static bool IsTargetable(IGameObject gameObject) + public override string ToString() => $"Interact({DataId})"; + + public void OnConditionChange(ConditionFlag flag, bool value) { - return gameObject.IsTargetable; + logger.LogDebug("Condition change: {Flag} = {Value}", flag, value); + if (_interactionState == EInteractionState.InteractionTriggered && + flag == ConditionFlag.OccupiedInQuestEvent && value) + { + logger.LogInformation("Interaction was most likely triggered"); + _interactionState = EInteractionState.InteractionConfirmed; + } } - public override string ToString() => $"Interact({DataId})"; + private enum EInteractionState + { + None, + InteractionTriggered, + InteractionConfirmed, + } } } diff --git a/Questionable/Controller/Steps/Interactions/UseItem.cs b/Questionable/Controller/Steps/Interactions/UseItem.cs index 0a8f953a..d32bb0a4 100644 --- a/Questionable/Controller/Steps/Interactions/UseItem.cs +++ b/Questionable/Controller/Steps/Interactions/UseItem.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Linq; using System.Numerics; using Dalamud.Game.ClientState.Conditions; using Dalamud.Plugin.Services; @@ -38,7 +39,6 @@ internal static class UseItem ArgumentNullException.ThrowIfNull(step.ItemId); - var unmount = serviceProvider.GetRequiredService(); if (step.ItemId == VesperBayAetheryteTicket) { unsafe @@ -50,17 +50,26 @@ internal static class UseItem var task = serviceProvider.GetRequiredService() .With(quest.Id, step.ItemId.Value, step.CompletionQuestVariablesFlags); + + int currentStepIndex = sequence.Steps.IndexOf(step); + QuestStep? nextStep = sequence.Steps.Skip(currentStepIndex + 1).FirstOrDefault(); + Vector3? nextPosition = (nextStep ?? step).Position; return [ - unmount, task, + task, new WaitConditionTask(() => clientState.TerritoryType == 140, $"Wait(territory: {territoryData.GetNameAndId(140)})"), + serviceProvider.GetRequiredService() + .With(140, + nextPosition != null ? MountTask.EMountIf.AwayFromPosition : MountTask.EMountIf.Always, + nextPosition), serviceProvider.GetRequiredService() .With(140, new(-408.92343f, 23.167036f, -351.16223f), 0.25f, dataId: null, disableNavMesh: true, sprint: false, fly: false) ]; } + var unmount = serviceProvider.GetRequiredService(); if (step.GroundTarget == true) { ITask task; @@ -197,12 +206,17 @@ internal static class UseItem } - internal sealed class UseOnGround(GameFunctions gameFunctions, QuestFunctions questFunctions, ICondition condition, ILogger logger) + internal sealed class UseOnGround( + GameFunctions gameFunctions, + QuestFunctions questFunctions, + ICondition condition, + ILogger logger) : UseItemBase(questFunctions, condition, logger) { public uint DataId { get; set; } - public ITask With(ElementId? questId, uint dataId, uint itemId, IList completionQuestVariablesFlags) + public ITask With(ElementId? questId, uint dataId, uint itemId, + IList completionQuestVariablesFlags) { QuestId = questId; DataId = dataId; @@ -225,7 +239,8 @@ internal static class UseItem { public Vector3 Position { get; set; } - public ITask With(ElementId? questId, Vector3 position, uint itemId, IList completionQuestVariablesFlags) + public ITask With(ElementId? questId, Vector3 position, uint itemId, + IList completionQuestVariablesFlags) { QuestId = questId; Position = position; @@ -240,12 +255,17 @@ internal static class UseItem $"UseItem({ItemId} on ground at {Position.ToString("G", CultureInfo.InvariantCulture)})"; } - internal sealed class UseOnObject(QuestFunctions questFunctions, GameFunctions gameFunctions, ICondition condition, ILogger logger) + internal sealed class UseOnObject( + QuestFunctions questFunctions, + GameFunctions gameFunctions, + ICondition condition, + ILogger logger) : UseItemBase(questFunctions, condition, logger) { public uint DataId { get; set; } - public ITask With(ElementId? questId, uint dataId, uint itemId, IList completionQuestVariablesFlags, + public ITask With(ElementId? questId, uint dataId, uint itemId, + IList completionQuestVariablesFlags, bool startingCombat = false) { QuestId = questId; @@ -261,7 +281,11 @@ internal static class UseItem public override string ToString() => $"UseItem({ItemId} on {DataId})"; } - internal sealed class Use(GameFunctions gameFunctions, QuestFunctions questFunctions, ICondition condition, ILogger logger) + internal sealed class Use( + GameFunctions gameFunctions, + QuestFunctions questFunctions, + ICondition condition, + ILogger logger) : UseItemBase(questFunctions, condition, logger) { public ITask With(ElementId? questId, uint itemId, IList completionQuestVariablesFlags) diff --git a/Questionable/Controller/Steps/Leves/InitiateLeve.cs b/Questionable/Controller/Steps/Leves/InitiateLeve.cs index 1c9ee563..42cd8a48 100644 --- a/Questionable/Controller/Steps/Leves/InitiateLeve.cs +++ b/Questionable/Controller/Steps/Leves/InitiateLeve.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using Dalamud.Game.ClientState.Conditions; using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.Game.Event; +using FFXIVClientStructs.FFXIV.Client.Game.UI; using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Component.GUI; using LLib.GameUI; @@ -22,6 +24,7 @@ internal static class InitiateLeve if (step.InteractionType != EInteractionType.InitiateLeve) yield break; + yield return serviceProvider.GetRequiredService().With(quest.Id); yield return serviceProvider.GetRequiredService().With(quest.Id); yield return serviceProvider.GetRequiredService().With(quest.Id); yield return serviceProvider.GetRequiredService(); @@ -32,6 +35,33 @@ internal static class InitiateLeve => throw new NotImplementedException(); } + internal sealed unsafe class SkipInitiateIfActive : ITask + { + private ElementId _elementId = null!; + + public ITask With(ElementId elementId) + { + _elementId = elementId; + return this; + } + + public bool Start() => true; + + public ETaskResult Update() + { + var director = UIState.Instance()->DirectorTodo.Director; + if (director != null && + director->EventHandlerInfo != null && + director->EventHandlerInfo->EventId.ContentId == EventHandlerType.GatheringLeveDirector && + director->ContentId == _elementId.Value) + return ETaskResult.SkipRemainingTasksForStep; + + return ETaskResult.TaskComplete; + } + + public override string ToString() => $"CheckIfAlreadyActive({_elementId})"; + } + internal sealed unsafe class OpenJournal : ITask { private ElementId _elementId = null!; diff --git a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs index 236f270c..6e7ad164 100644 --- a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs +++ b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using Dalamud.Game.ClientState.Conditions; using Dalamud.Plugin.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -32,14 +33,19 @@ internal static class AethernetShortcut internal sealed class UseAethernetShortcut( ILogger logger, + AetheryteFunctions aetheryteFunctions, GameFunctions gameFunctions, IClientState clientState, AetheryteData aetheryteData, + TerritoryData territoryData, LifestreamIpc lifestreamIpc, - MovementController movementController) : ISkippableTask + MovementController movementController, + ICondition condition) : ISkippableTask { private bool _moving; private bool _teleported; + private bool _triedMounting; + private DateTime _continueAt = DateTime.MinValue; public EAetheryteLocation From { get; set; } public EAetheryteLocation To { get; set; } @@ -72,22 +78,22 @@ internal static class AethernetShortcut } if (SkipConditions.AetheryteLocked != null && - !gameFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteLocked.Value)) + !aetheryteFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteLocked.Value)) { logger.LogInformation("Skipping aethernet shortcut because the target aetheryte is locked"); return false; } if (SkipConditions.AetheryteUnlocked != null && - gameFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteUnlocked.Value)) + aetheryteFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteUnlocked.Value)) { logger.LogInformation("Skipping aethernet shortcut because the target aetheryte is unlocked"); return false; } } - if (gameFunctions.IsAetheryteUnlocked(From) && - gameFunctions.IsAetheryteUnlocked(To)) + if (aetheryteFunctions.IsAetheryteUnlocked(From) && + aetheryteFunctions.IsAetheryteUnlocked(To)) { ushort territoryType = clientState.TerritoryType; Vector3 playerPosition = clientState.LocalPlayer!.Position; @@ -123,11 +129,19 @@ internal static class AethernetShortcut } else { - logger.LogInformation("Moving to aethernet shortcut"); - _moving = true; - movementController.NavigateTo(EMovementType.Quest, (uint)From, aetheryteData.Locations[From], - false, true, - AetheryteConverter.IsLargeAetheryte(From) ? 10.9f : 6.9f); + if (territoryData.CanUseMount(territoryType) && + aetheryteData.CalculateDistance(playerPosition, territoryType, From) > 30 && + !gameFunctions.HasStatusPreventingMount()) + { + _triedMounting = gameFunctions.Mount(); + if (_triedMounting) + { + _continueAt = DateTime.Now.AddSeconds(0.5); + return true; + } + } + + MoveTo(From); return true; } } @@ -140,8 +154,32 @@ internal static class AethernetShortcut return false; } + private void MoveTo(EAetheryteLocation from) + { + logger.LogInformation("Moving to aethernet shortcut"); + _moving = true; + movementController.NavigateTo(EMovementType.Quest, (uint)From, aetheryteData.Locations[From], + false, true, + AetheryteConverter.IsLargeAetheryte(From) ? 10.9f : 6.9f); + } + public ETaskResult Update() { + if (DateTime.Now < _continueAt) + return ETaskResult.StillRunning; + + if (_triedMounting) + { + if (condition[ConditionFlag.Mounted]) + { + _triedMounting = false; + MoveTo(From); + return ETaskResult.StillRunning; + } + else + return ETaskResult.StillRunning; + } + if (_moving) { var movementStartedAt = movementController.MovementStartedAt; diff --git a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs index cf6ecec0..b7b98d0a 100644 --- a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs +++ b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs @@ -17,7 +17,7 @@ internal static class AetheryteShortcut { internal sealed class Factory( IServiceProvider serviceProvider, - GameFunctions gameFunctions, + AetheryteFunctions aetheryteFunctions, AetheryteData aetheryteData) : ITaskFactory { public IEnumerable CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) @@ -29,7 +29,7 @@ internal static class AetheryteShortcut .With(step, step.AetheryteShortcut.Value, aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]); return [ - new WaitConditionTask(() => gameFunctions.CanTeleport(step.AetheryteShortcut.Value), "CanTeleport"), + new WaitConditionTask(() => aetheryteFunctions.CanTeleport(step.AetheryteShortcut.Value), "CanTeleport"), task ]; } @@ -40,7 +40,7 @@ internal static class AetheryteShortcut internal sealed class UseAetheryteShortcut( ILogger logger, - GameFunctions gameFunctions, + AetheryteFunctions aetheryteFunctions, IClientState clientState, IChatGui chatGui, AetheryteData aetheryteData) : ISkippableTask @@ -80,14 +80,14 @@ internal static class AetheryteShortcut } if (skipConditions.AetheryteLocked != null && - !gameFunctions.IsAetheryteUnlocked(skipConditions.AetheryteLocked.Value)) + !aetheryteFunctions.IsAetheryteUnlocked(skipConditions.AetheryteLocked.Value)) { logger.LogInformation("Skipping aetheryte teleport due to SkipCondition (AetheryteLocked)"); return false; } if (skipConditions.AetheryteUnlocked != null && - gameFunctions.IsAetheryteUnlocked(skipConditions.AetheryteUnlocked.Value)) + aetheryteFunctions.IsAetheryteUnlocked(skipConditions.AetheryteUnlocked.Value)) { logger.LogInformation("Skipping aetheryte teleport due to SkipCondition (AetheryteUnlocked)"); return false; @@ -124,12 +124,12 @@ internal static class AetheryteShortcut } } - if (!gameFunctions.IsAetheryteUnlocked(TargetAetheryte)) + if (!aetheryteFunctions.IsAetheryteUnlocked(TargetAetheryte)) { chatGui.PrintError($"[Questionable] Aetheryte {TargetAetheryte} is not unlocked."); throw new TaskException("Aetheryte is not unlocked"); } - else if (gameFunctions.TeleportAetheryte(TargetAetheryte)) + else if (aetheryteFunctions.TeleportAetheryte(TargetAetheryte)) { logger.LogInformation("Travelling via aetheryte..."); return true; diff --git a/Questionable/Controller/Steps/Shared/Move.cs b/Questionable/Controller/Steps/Shared/Move.cs index 8ba93503..83b0f932 100644 --- a/Questionable/Controller/Steps/Shared/Move.cs +++ b/Questionable/Controller/Steps/Shared/Move.cs @@ -4,17 +4,21 @@ using System.Globalization; using System.Numerics; using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects.Types; +using Dalamud.Game.Text.SeStringHandling; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Character; +using LLib; +using Lumina.Excel.GeneratedSheets; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Questionable.Controller.NavigationOverrides; using Questionable.Controller.Steps.Common; using Questionable.Data; using Questionable.Functions; using Questionable.Model; using Questionable.Model.Questing; +using Action = System.Action; +using Quest = Questionable.Model.Quest; namespace Questionable.Controller.Steps.Shared; @@ -146,8 +150,12 @@ internal static class Move internal sealed class MoveInternal( MovementController movementController, GameFunctions gameFunctions, - ILogger logger) : ITask + ILogger logger, + ICondition condition, + IDataManager dataManager) : ITask, IToastAware { + private string _cannotExecuteAtThisTime = dataManager.GetString(579, x => x.Text)!; + public Action StartAction { get; set; } = null!; public Vector3 Destination { get; set; } @@ -221,6 +229,15 @@ internal static class Move } public override string ToString() => $"MoveTo({Destination.ToString("G", CultureInfo.InvariantCulture)})"; + + public bool OnErrorToast(SeString message) + { + if (GameFunctions.GameStringEquals(_cannotExecuteAtThisTime, message.TextValue) && + condition[ConditionFlag.Diving]) + return true; + + return false; + } } internal sealed class ExpectToBeNearDataId(GameFunctions gameFunctions, IClientState clientState) : ITask diff --git a/Questionable/Controller/Steps/Shared/SkipCondition.cs b/Questionable/Controller/Steps/Shared/SkipCondition.cs index d5e8e5d1..62ce22d8 100644 --- a/Questionable/Controller/Steps/Shared/SkipCondition.cs +++ b/Questionable/Controller/Steps/Shared/SkipCondition.cs @@ -41,6 +41,7 @@ internal static class SkipCondition internal sealed class CheckSkip( ILogger logger, + AetheryteFunctions aetheryteFunctions, GameFunctions gameFunctions, QuestFunctions questFunctions, IClientState clientState) : ITask @@ -145,21 +146,21 @@ internal static class SkipCondition DataId: not null, InteractionType: EInteractionType.AttuneAetheryte or EInteractionType.AttuneAethernetShard } && - gameFunctions.IsAetheryteUnlocked((EAetheryteLocation)Step.DataId.Value)) + aetheryteFunctions.IsAetheryteUnlocked((EAetheryteLocation)Step.DataId.Value)) { logger.LogInformation("Skipping step, as aetheryte/aethernet shard is unlocked"); return true; } if (SkipConditions.AetheryteLocked != null && - !gameFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteLocked.Value)) + !aetheryteFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteLocked.Value)) { logger.LogInformation("Skipping step, as aetheryte is locked"); return true; } if (SkipConditions.AetheryteUnlocked != null && - gameFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteUnlocked.Value)) + aetheryteFunctions.IsAetheryteUnlocked(SkipConditions.AetheryteUnlocked.Value)) { logger.LogInformation("Skipping step, as aetheryte is unlocked"); return true; @@ -203,7 +204,8 @@ internal static class SkipCondition } } - if (SkipConditions.ExtraCondition == EExtraSkipCondition.WakingSandsMainArea) + if (SkipConditions.ExtraCondition == EExtraSkipCondition.WakingSandsMainArea && + clientState.TerritoryType == 212) { var position = clientState.LocalPlayer!.Position; if (position.X < 24) @@ -213,6 +215,17 @@ internal static class SkipCondition } } + if (SkipConditions.ExtraCondition == EExtraSkipCondition.RisingStonesSolar && + clientState.TerritoryType == 351) + { + var position = clientState.LocalPlayer!.Position; + if (position.Z <= -28) + { + logger.LogInformation("Skipping step, as we're in the Rising Stones Solar"); + return true; + } + } + if (Step.PickUpQuestId != null && questFunctions.IsQuestAcceptedOrComplete(Step.PickUpQuestId)) { logger.LogInformation("Skipping step, as we have already picked up the relevant quest"); diff --git a/Questionable/DalamudInitializer.cs b/Questionable/DalamudInitializer.cs index 76678de6..239fd64c 100644 --- a/Questionable/DalamudInitializer.cs +++ b/Questionable/DalamudInitializer.cs @@ -1,7 +1,10 @@ using System; +using Dalamud.Game.Gui.Toast; +using Dalamud.Game.Text.SeStringHandling; using Dalamud.Interface.Windowing; using Dalamud.Plugin; using Dalamud.Plugin.Services; +using Microsoft.Extensions.Logging; using Questionable.Controller; using Questionable.Windows; @@ -17,6 +20,8 @@ internal sealed class DalamudInitializer : IDisposable private readonly WindowSystem _windowSystem; private readonly QuestWindow _questWindow; private readonly ConfigWindow _configWindow; + private readonly IToastGui _toastGui; + private readonly ILogger _logger; public DalamudInitializer( IDalamudPluginInterface pluginInterface, @@ -31,7 +36,9 @@ internal sealed class DalamudInitializer : IDisposable ConfigWindow configWindow, QuestSelectionWindow questSelectionWindow, QuestValidationWindow questValidationWindow, - JournalProgressWindow journalProgressWindow) + JournalProgressWindow journalProgressWindow, + IToastGui toastGui, + ILogger logger) { _pluginInterface = pluginInterface; _framework = framework; @@ -41,6 +48,8 @@ internal sealed class DalamudInitializer : IDisposable _windowSystem = windowSystem; _questWindow = questWindow; _configWindow = configWindow; + _toastGui = toastGui; + _logger = logger; _windowSystem.AddWindow(questWindow); _windowSystem.AddWindow(configWindow); @@ -54,6 +63,9 @@ internal sealed class DalamudInitializer : IDisposable _pluginInterface.UiBuilder.OpenConfigUi += _configWindow.Toggle; _framework.Update += FrameworkUpdate; _framework.RunOnTick(gameUiController.HandleCurrentDialogueChoices, TimeSpan.FromMilliseconds(200)); + _toastGui.Toast += OnToast; + _toastGui.ErrorToast += OnErrorToast; + _toastGui.QuestToast += OnQuestToast; } private void FrameworkUpdate(IFramework framework) @@ -71,8 +83,20 @@ internal sealed class DalamudInitializer : IDisposable } } + private void OnToast(ref SeString message, ref ToastOptions options, ref bool isHandled) + => _logger.LogInformation("Normal Toast: {Message}", message); + + private void OnErrorToast(ref SeString message, ref bool isHandled) + => _logger.LogInformation("Error Toast: {Message}", message); + + private void OnQuestToast(ref SeString message, ref QuestToastOptions options, ref bool isHandled) + => _logger.LogInformation("Quest Toast: {Message}", message); + public void Dispose() { + _toastGui.QuestToast -= OnQuestToast; + _toastGui.ErrorToast -= OnErrorToast; + _toastGui.Toast -= OnToast; _framework.Update -= FrameworkUpdate; _pluginInterface.UiBuilder.OpenConfigUi -= _configWindow.Toggle; _pluginInterface.UiBuilder.OpenMainUi -= _questWindow.Toggle; diff --git a/Questionable/Data/JournalData.cs b/Questionable/Data/JournalData.cs index ae6c6ac2..fca04e82 100644 --- a/Questionable/Data/JournalData.cs +++ b/Questionable/Data/JournalData.cs @@ -22,17 +22,17 @@ internal sealed class JournalData var genreLimsa = new Genre(uint.MaxValue - 3, "Starting in Limsa Lominsa", 1, new uint[] { 108, 109 }.Concat(limsaStart.Quest.Select(x => x.Row)) .Where(x => x != 0) - .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF)))) + .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF)))) .ToList()); var genreGridania = new Genre(uint.MaxValue - 2, "Starting in Gridania", 1, new uint[] { 85, 123, 124 }.Concat(gridaniaStart.Quest.Select(x => x.Row)) .Where(x => x != 0) - .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF)))) + .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF)))) .ToList()); var genreUldah = new Genre(uint.MaxValue - 1, "Starting in Ul'dah", 1, new uint[] { 568, 569, 570 }.Concat(uldahStart.Quest.Select(x => x.Row)) .Where(x => x != 0) - .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF)))) + .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF)))) .ToList()); genres.InsertRange(0, [genreLimsa, genreGridania, genreUldah]); genres.Single(x => x.Id == 1) @@ -57,7 +57,7 @@ internal sealed class JournalData internal sealed class Genre { - public Genre(JournalGenre journalGenre, List quests) + public Genre(JournalGenre journalGenre, List quests) { Id = journalGenre.RowId; Name = journalGenre.Name.ToString(); @@ -65,7 +65,7 @@ internal sealed class JournalData Quests = quests; } - public Genre(uint id, string name, uint categoryId, List quests) + public Genre(uint id, string name, uint categoryId, List quests) { Id = id; Name = name; @@ -76,7 +76,7 @@ internal sealed class JournalData public uint Id { get; } public string Name { get; } public uint CategoryId { get; } - public List Quests { get; } + public List Quests { get; } public int QuestCount => Quests.Count; } diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index 8f42db9a..4c01199d 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using Dalamud.Plugin.Services; +using LLib.GameData; using Lumina.Excel.GeneratedSheets; using Questionable.Model; using Questionable.Model.Questing; @@ -11,16 +13,41 @@ namespace Questionable.Data; internal sealed class QuestData { + public static readonly IReadOnlyList CrystalTowerQuests = + [new(1709), new(1200), new(1201), new(1202), new(1203), new(1474), new(494), new(495)]; + + public static readonly IReadOnlyList TankRoleQuests = [136, 154, 178]; + public static readonly IReadOnlyList HealerRoleQuests = [137, 155, 179]; + public static readonly IReadOnlyList MeleeRoleQuests = [138, 156, 180]; + public static readonly IReadOnlyList PhysicalRangedRoleQuests = [138, 157, 181]; + public static readonly IReadOnlyList CasterRoleQuests = [139, 158, 182]; + public static readonly IReadOnlyList> AllRoleQuestChapters = + [ + TankRoleQuests, + HealerRoleQuests, + MeleeRoleQuests, + PhysicalRangedRoleQuests, + CasterRoleQuests + ]; + + public static readonly IReadOnlyList FinalShadowbringersRoleQuests = + [new(3248), new(3272), new(3278), new(3628)]; + private readonly Dictionary _quests; public QuestData(IDataManager dataManager) { + Dictionary questChapters = + dataManager.GetExcelSheet()! + .Where(x => x.RowId > 0 && x.Quest.Row > 0) + .ToDictionary(x => x.Quest.Row, x => x.Redo); + List quests = [ ..dataManager.GetExcelSheet()! .Where(x => x.RowId > 0) .Where(x => x.IssuerLocation.Row > 0) - .Select(x => new QuestInfo(x)), + .Select(x => new QuestInfo(x, questChapters.GetValueOrDefault(x.RowId))), ..dataManager.GetExcelSheet()! .Where(x => x.RowId > 0) .Select(x => new SatisfactionSupplyInfo(x)), @@ -30,6 +57,10 @@ internal sealed class QuestData .Select(x => new LeveInfo(x)), ]; _quests = quests.ToDictionary(x => x.QuestId, x => x); + + // workaround because the game doesn't require completion of the CT questline through normal means + QuestInfo aTimeToEveryPurpose = (QuestInfo) _quests[new QuestId(425)]; + aTimeToEveryPurpose.AddPreviousQuest(new QuestId(495)); } public IQuestInfo GetQuestInfo(ElementId elementId) @@ -37,6 +68,11 @@ internal sealed class QuestData return _quests[elementId] ?? throw new ArgumentOutOfRangeException(nameof(elementId)); } + public bool TryGetQuestInfo(ElementId elementId, [NotNullWhen(true)] out IQuestInfo? questInfo) + { + return _quests.TryGetValue(elementId, out questInfo); + } + public List GetAllByIssuerDataId(uint targetId) { return _quests.Values @@ -46,14 +82,102 @@ internal sealed class QuestData public bool IsIssuerOfAnyQuest(uint targetId) => _quests.Values.Any(x => x.IssuerDataId == targetId); - public List GetAllByJournalGenre(uint journalGenre) + public List GetAllByJournalGenre(uint journalGenre) { return _quests.Values - .Where(x => x is QuestInfo { IsSeasonalEvent: false }) - .Cast() + .Where(x => x is QuestInfo { IsSeasonalEvent: false } or not QuestInfo) .Where(x => x.JournalGenre == journalGenre) .OrderBy(x => x.SortKey) .ThenBy(x => x.QuestId) .ToList(); } + + public List GetClassJobQuests(EClassJob classJob) + { + List chapterIds = classJob switch + { + EClassJob.Adventurer => throw new ArgumentOutOfRangeException(nameof(classJob)), + + // ARR + EClassJob.Gladiator => [63], + EClassJob.Paladin => [72, 73, 74, 75], + EClassJob.Marauder => [64], + EClassJob.Warrior => [76, 77, 78, 79], + EClassJob.Conjurer => [65], + EClassJob.WhiteMage => [86, 87, 88, 89], + EClassJob.Arcanist => [66], + EClassJob.Summoner => [127, 128, 129, 130], + EClassJob.Scholar => [90, 91, 92, 93], + EClassJob.Pugilist => [67], + EClassJob.Monk => [98, 99, 100, 101], + EClassJob.Lancer => [68], + EClassJob.Dragoon => [102, 103, 104, 105], + EClassJob.Rogue => [69], + EClassJob.Ninja => [106, 107, 108, 109], + EClassJob.Archer => [70], + EClassJob.Bard => [113, 114, 115, 116], + EClassJob.Thaumaturge => [71], + EClassJob.BlackMage => [123, 124, 125, 126], + + // HW + EClassJob.DarkKnight => [80, 81, 82, 83], + EClassJob.Astrologian => [94, 95, 96, 97], + EClassJob.Machinist => [117, 118, 119, 120], + + // SB + EClassJob.Samurai => [110, 111, 112], + EClassJob.RedMage => [131, 132, 133], + EClassJob.BlueMage => [134, 135, 146, 170], + + // ShB + EClassJob.Gunbreaker => [84, 85], + EClassJob.Dancer => [121, 122], + + // EW + EClassJob.Sage => [152], + EClassJob.Reaper => [153], + + // DT + EClassJob.Viper => [176], + EClassJob.Pictomancer => [177], + + // Crafter + EClassJob.Alchemist => [48, 49, 50], + EClassJob.Armorer => [36, 37, 38], + EClassJob.Blacksmith => [33, 34, 35], + EClassJob.Carpenter => [30, 31, 32], + EClassJob.Culinarian => [51, 52, 53], + EClassJob.Goldsmith => [39, 40, 41], + EClassJob.Leatherworker => [42, 43, 44], + EClassJob.Weaver => [45, 46, 47], + + // Gatherer + EClassJob.Miner => [54, 55, 56], + EClassJob.Botanist => [57, 58, 59], + EClassJob.Fisher => [60, 61, 62], + + _ => throw new ArgumentOutOfRangeException(nameof(classJob)), + }; + + chapterIds.AddRange(classJob switch + { + _ when classJob.IsTank() => TankRoleQuests, + _ when classJob.IsHealer() => HealerRoleQuests, + _ when classJob.IsMelee() => MeleeRoleQuests, + _ when classJob.IsPhysicalRanged() => PhysicalRangedRoleQuests, + _ when classJob.IsCaster() && classJob != EClassJob.BlueMage => CasterRoleQuests, + _ => [] + }); + + return GetQuestsInNewGamePlusChapters(chapterIds); + } + + private List GetQuestsInNewGamePlusChapters(List chapterIds) + { + return _quests.Values + .Where(x => x is QuestInfo) + .Cast() + .Where(x => chapterIds.Contains(x.NewGamePlusChapter)) + .ToList(); + } } diff --git a/Questionable/Functions/AetheryteFunctions.cs b/Questionable/Functions/AetheryteFunctions.cs new file mode 100644 index 00000000..21f5a13e --- /dev/null +++ b/Questionable/Functions/AetheryteFunctions.cs @@ -0,0 +1,77 @@ +using System; +using FFXIVClientStructs.FFXIV.Client.Game; +using FFXIVClientStructs.FFXIV.Client.Game.UI; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Questionable.Model.Common; +using Questionable.Model.Questing; + +namespace Questionable.Functions; + +internal sealed unsafe class AetheryteFunctions +{ + private readonly IServiceProvider _serviceProvider; + private readonly ILogger _logger; + + public AetheryteFunctions(IServiceProvider serviceProvider, ILogger logger) + { + _serviceProvider = serviceProvider; + _logger = logger; + } + + public DateTime ReturnRequestedAt { get; set; } = DateTime.MinValue; + + public bool IsAetheryteUnlocked(uint aetheryteId, out byte subIndex) + { + subIndex = 0; + + var uiState = UIState.Instance(); + return uiState != null && uiState->IsAetheryteUnlocked(aetheryteId); + } + + public bool IsAetheryteUnlocked(EAetheryteLocation aetheryteLocation) + { + if (aetheryteLocation == EAetheryteLocation.IshgardFirmament) + return _serviceProvider.GetRequiredService().IsQuestComplete(new QuestId(3672)); + return IsAetheryteUnlocked((uint)aetheryteLocation, out _); + } + + public bool CanTeleport(EAetheryteLocation aetheryteLocation) + { + if ((ushort)aetheryteLocation == PlayerState.Instance()->HomeAetheryteId && + ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 8) == 0) + return true; + + return ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0; + } + + public bool TeleportAetheryte(uint aetheryteId) + { + _logger.LogDebug("Attempting to teleport to aetheryte {AetheryteId}", aetheryteId); + if (IsAetheryteUnlocked(aetheryteId, out var subIndex)) + { + if (aetheryteId == PlayerState.Instance()->HomeAetheryteId && + ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 8) == 0) + { + ReturnRequestedAt = DateTime.Now; + if (ActionManager.Instance()->UseAction(ActionType.GeneralAction, 8)) + { + _logger.LogInformation("Using 'return' for home aetheryte"); + return true; + } + } + + if (ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0) + { + // fallback if return isn't available or (more likely) on a different aetheryte + _logger.LogInformation("Teleporting to aetheryte {AetheryteId}", aetheryteId); + return Telepo.Instance()->Teleport(aetheryteId, subIndex); + } + } + + return false; + } + + public bool TeleportAetheryte(EAetheryteLocation aetheryteLocation) + => TeleportAetheryte((uint)aetheryteLocation); +} diff --git a/Questionable/Functions/GameFunctions.cs b/Questionable/Functions/GameFunctions.cs index 4b0b5e13..e1c20069 100644 --- a/Questionable/Functions/GameFunctions.cs +++ b/Questionable/Functions/GameFunctions.cs @@ -74,62 +74,6 @@ internal sealed unsafe class GameFunctions .AsReadOnly(); } - public DateTime ReturnRequestedAt { get; set; } = DateTime.MinValue; - - public bool IsAetheryteUnlocked(uint aetheryteId, out byte subIndex) - { - subIndex = 0; - - var uiState = UIState.Instance(); - return uiState != null && uiState->IsAetheryteUnlocked(aetheryteId); - } - - public bool IsAetheryteUnlocked(EAetheryteLocation aetheryteLocation) - { - if (aetheryteLocation == EAetheryteLocation.IshgardFirmament) - return _questFunctions.IsQuestComplete(new QuestId(3672)); - return IsAetheryteUnlocked((uint)aetheryteLocation, out _); - } - - public bool CanTeleport(EAetheryteLocation aetheryteLocation) - { - if ((ushort)aetheryteLocation == PlayerState.Instance()->HomeAetheryteId && - ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 8) == 0) - return true; - - return ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0; - } - - public bool TeleportAetheryte(uint aetheryteId) - { - _logger.LogDebug("Attempting to teleport to aetheryte {AetheryteId}", aetheryteId); - if (IsAetheryteUnlocked(aetheryteId, out var subIndex)) - { - if (aetheryteId == PlayerState.Instance()->HomeAetheryteId && - ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 8) == 0) - { - ReturnRequestedAt = DateTime.Now; - if (ActionManager.Instance()->UseAction(ActionType.GeneralAction, 8)) - { - _logger.LogInformation("Using 'return' for home aetheryte"); - return true; - } - } - - if (ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0) - { - // fallback if return isn't available or (more likely) on a different aetheryte - _logger.LogInformation("Teleporting to aetheryte {AetheryteId}", aetheryteId); - return Telepo.Instance()->Teleport(aetheryteId, subIndex); - } - } - - return false; - } - - public bool TeleportAetheryte(EAetheryteLocation aetheryteLocation) - => TeleportAetheryte((uint)aetheryteLocation); - public bool IsFlyingUnlocked(ushort territoryId) { if (_configuration.Advanced.NeverFly) diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index 7c907f83..d1988668 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using Dalamud.Memory; @@ -12,8 +13,10 @@ using LLib.GameData; using LLib.GameUI; using Lumina.Excel.GeneratedSheets; using Questionable.Controller; +using Questionable.Controller.Steps.Interactions; using Questionable.Data; using Questionable.Model; +using Questionable.Model.Common; using Questionable.Model.Questing; using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; using Quest = Questionable.Model.Quest; @@ -24,16 +27,24 @@ internal sealed unsafe class QuestFunctions { private readonly QuestRegistry _questRegistry; private readonly QuestData _questData; + private readonly AetheryteFunctions _aetheryteFunctions; private readonly Configuration _configuration; private readonly IDataManager _dataManager; private readonly IClientState _clientState; private readonly IGameGui _gameGui; - public QuestFunctions(QuestRegistry questRegistry, QuestData questData, Configuration configuration, - IDataManager dataManager, IClientState clientState, IGameGui gameGui) + public QuestFunctions( + QuestRegistry questRegistry, + QuestData questData, + AetheryteFunctions aetheryteFunctions, + Configuration configuration, + IDataManager dataManager, + IClientState clientState, + IGameGui gameGui) { _questRegistry = questRegistry; _questData = questData; + _aetheryteFunctions = aetheryteFunctions; _configuration = configuration; _dataManager = dataManager; _clientState = clientState; @@ -99,8 +110,11 @@ internal sealed unsafe class QuestFunctions { // always prioritize accepting MSQ quests, to make sure we don't turn in one MSQ quest and then go off to do // side quests until the end of time. - var msqQuest = GetMainScenarioQuest(questManager); - if (msqQuest.CurrentQuest is { Value: not 0 } && _questRegistry.IsKnownQuest(msqQuest.CurrentQuest)) + var msqQuest = GetMainScenarioQuest(); + if (msqQuest.CurrentQuest != null && !_questRegistry.IsKnownQuest(msqQuest.CurrentQuest)) + msqQuest = default; + + if (msqQuest.CurrentQuest != null && !IsQuestAccepted(msqQuest.CurrentQuest)) return msqQuest; // Use the quests in the same order as they're shown in the to-do list, e.g. if the MSQ is the first item, @@ -133,14 +147,24 @@ internal sealed unsafe class QuestFunctions return (currentQuest, QuestManager.GetQuestSequence(currentQuest.Value)); } - // if we know no quest of those currently in the to-do list, just do MSQ - return msqQuest; + ElementId? priorityQuest = GetNextPriorityQuestThatCanBeAccepted(); + if (priorityQuest != null) + { + // if we have an accepted msq quest, and know of no quest of those currently in the to-do list... + // (1) try and find a priority quest to do + return (priorityQuest, QuestManager.GetQuestSequence(priorityQuest.Value)); + } + else if (msqQuest.CurrentQuest != null) + { + // (2) just do a normal msq quest + return msqQuest; + } } return default; } - private (QuestId? CurrentQuest, byte Sequence) GetMainScenarioQuest(QuestManager* questManager) + private (QuestId? CurrentQuest, byte Sequence) GetMainScenarioQuest() { if (QuestManager.IsQuestComplete(3759)) // Memories Rekindled { @@ -177,6 +201,7 @@ internal sealed unsafe class QuestFunctions return default; // if the MSQ is hidden, we generally ignore it + QuestManager* questManager = QuestManager.Instance(); if (IsQuestAccepted(currentQuest) && questManager->GetQuestById(currentQuest.Value)->IsHidden) return default; @@ -214,6 +239,72 @@ internal sealed unsafe class QuestFunctions return null; } + public ElementId? GetNextPriorityQuestThatCanBeAccepted() + { + return GetPriorityQuestsThatCanBeAccepted() + .FirstOrDefault(x => + { + if (!_questRegistry.TryGetQuest(x, out Quest? quest)) + return false; + + var firstStep = quest.FindSequence(0)?.FindStep(0); + if (firstStep == null) + return false; + + if (firstStep.AetheryteShortcut is { } aetheryteShortcut && + _aetheryteFunctions.IsAetheryteUnlocked(aetheryteShortcut)) + return true; + + if (firstStep is + { InteractionType: EInteractionType.UseItem, ItemId: UseItem.VesperBayAetheryteTicket }) + return true; + + return false; + }); + } + + private List GetPriorityQuestsThatCanBeAccepted() + { + List priorityQuests = + [ + new QuestId(1157), // Garuda (Hard) + new QuestId(1158), // Titan (Hard) + ..QuestData.CrystalTowerQuests + ]; + + EClassJob classJob = (EClassJob?)_clientState.LocalPlayer?.ClassJob.Id ?? EClassJob.Adventurer; + ushort[] shadowbringersRoleQuestChapters = QuestData.AllRoleQuestChapters.Select(x => x[0]).ToArray(); + if (classJob != EClassJob.Adventurer) + { + priorityQuests.AddRange(_questRegistry.GetKnownClassJobQuests(classJob) + .Where(x => + { + if (!_questRegistry.TryGetQuest(x.QuestId, out Quest? quest) || + quest.Info is not QuestInfo questInfo) + return false; + + // if no shadowbringers role quest is complete, (at least one) is required + if (shadowbringersRoleQuestChapters.Contains(questInfo.NewGamePlusChapter)) + return !QuestData.FinalShadowbringersRoleQuests.Any(IsQuestComplete); + + // ignore all other role quests + if (QuestData.AllRoleQuestChapters.Any(y => y.Contains(questInfo.NewGamePlusChapter))) + return false; + + // even job quests for the later expacs (after role quests were introduced) might have skills locked + // behind them, e.g. reaper and sage + + return true; + }) + .Select(x => x.QuestId)); + } + + return priorityQuests + .Where(_questRegistry.IsKnownQuest) + .Where(IsReadyToAcceptQuest) + .ToList(); + } + public bool IsReadyToAcceptQuest(ElementId questId) { _questRegistry.TryGetQuest(questId, out var quest); diff --git a/Questionable/Model/IQuestInfo.cs b/Questionable/Model/IQuestInfo.cs index 1410de30..1a2f557a 100644 --- a/Questionable/Model/IQuestInfo.cs +++ b/Questionable/Model/IQuestInfo.cs @@ -14,8 +14,11 @@ public interface IQuestInfo public bool IsRepeatable { get; } public ushort Level { get; } public EBeastTribe BeastTribe { get; } + public uint? JournalGenre { get; } + public ushort SortKey { get; } public bool IsMainScenarioQuest { get; } public IReadOnlyList ClassJobs { get; } + public EExpansionVersion Expansion { get; } public string SimplifiedName => Name .Replace(".", "", StringComparison.Ordinal) diff --git a/Questionable/Model/LeveInfo.cs b/Questionable/Model/LeveInfo.cs index 2be46ecb..8d454e5b 100644 --- a/Questionable/Model/LeveInfo.cs +++ b/Questionable/Model/LeveInfo.cs @@ -12,8 +12,11 @@ internal sealed class LeveInfo : IQuestInfo QuestId = new LeveId((ushort)leve.RowId); Name = leve.Name; Level = leve.ClassJobLevel; + JournalGenre = leve.JournalGenre.Row; + SortKey = QuestId.Value; IssuerDataId = leve.LevelLevemete.Value!.Object; ClassJobs = QuestInfoUtils.AsList(leve.ClassJobCategory.Value!); + Expansion = (EExpansionVersion)leve.LevelLevemete.Value.Territory.Value!.ExVersion.Row; } public ElementId QuestId { get; } @@ -22,6 +25,9 @@ internal sealed class LeveInfo : IQuestInfo public bool IsRepeatable => true; public ushort Level { get; } public EBeastTribe BeastTribe => EBeastTribe.None; + public uint? JournalGenre { get; } + public ushort SortKey { get; } public bool IsMainScenarioQuest => false; public IReadOnlyList ClassJobs { get; } + public EExpansionVersion Expansion { get; } } diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index 769ad7cb..e9a70ea3 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -11,7 +11,7 @@ namespace Questionable.Model; internal sealed class QuestInfo : IQuestInfo { - public QuestInfo(ExcelQuest quest) + public QuestInfo(ExcelQuest quest, ushort newGamePlusChapter) { QuestId = new QuestId((ushort)(quest.RowId & 0xFFFF)); @@ -54,6 +54,8 @@ internal sealed class QuestInfo : IQuestInfo BeastTribe = (EBeastTribe)quest.BeastTribe.Row; ClassJobs = QuestInfoUtils.AsList(quest.ClassJobCategory0.Value!); IsSeasonalEvent = quest.Festival.Row != 0; + NewGamePlusChapter = newGamePlusChapter; + Expansion = (EExpansionVersion)quest.Expansion.Row; } @@ -62,20 +64,22 @@ internal sealed class QuestInfo : IQuestInfo public ushort Level { get; } public uint IssuerDataId { get; } public bool IsRepeatable { get; } - public ImmutableList PreviousQuests { get; } + public ImmutableList PreviousQuests { get; set; } public QuestJoin PreviousQuestJoin { get; } public ImmutableList QuestLocks { get; } public QuestJoin QuestLockJoin { get; } public List PreviousInstanceContent { get; } public QuestJoin PreviousInstanceContentJoin { get; } public uint? JournalGenre { get; } - public ushort SortKey { get; set; } + public ushort SortKey { get; } public bool IsMainScenarioQuest { get; } public bool CompletesInstantly { get; } public GrandCompany GrandCompany { get; } public EBeastTribe BeastTribe { get; } public IReadOnlyList ClassJobs { get; } public bool IsSeasonalEvent { get; } + public ushort NewGamePlusChapter { get; } + public EExpansionVersion Expansion { get; } [UsedImplicitly(ImplicitUseKindFlags.Assign, ImplicitUseTargetFlags.Members)] public enum QuestJoin : byte @@ -84,4 +88,9 @@ internal sealed class QuestInfo : IQuestInfo All = 1, AtLeastOne = 2, } + + public void AddPreviousQuest(QuestId questId) + { + PreviousQuests = [..PreviousQuests, questId]; + } } diff --git a/Questionable/Model/SatisfactionSupplyInfo.cs b/Questionable/Model/SatisfactionSupplyInfo.cs index 810437c6..17c56772 100644 --- a/Questionable/Model/SatisfactionSupplyInfo.cs +++ b/Questionable/Model/SatisfactionSupplyInfo.cs @@ -13,6 +13,8 @@ internal sealed class SatisfactionSupplyInfo : IQuestInfo Name = npc.Npc.Value!.Singular; IssuerDataId = npc.Npc.Row; Level = npc.LevelUnlock; + SortKey = QuestId.Value; + Expansion = (EExpansionVersion)npc.QuestRequired.Value!.Expansion.Row; } public ElementId QuestId { get; } @@ -21,7 +23,10 @@ internal sealed class SatisfactionSupplyInfo : IQuestInfo public bool IsRepeatable => true; public ushort Level { get; } public EBeastTribe BeastTribe => EBeastTribe.None; + public uint? JournalGenre => null; + public ushort SortKey { get; } public bool IsMainScenarioQuest => false; + public EExpansionVersion Expansion { get; } /// /// We don't have collectables implemented for any other class. diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 3c0c7842..4b3b635d 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -46,7 +46,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin ICommandManager commandManager, IAddonLifecycle addonLifecycle, IKeyState keyState, - IContextMenu contextMenu) + IContextMenu contextMenu, + IToastGui toastGui) { ArgumentNullException.ThrowIfNull(pluginInterface); ArgumentNullException.ThrowIfNull(chatGui); @@ -72,6 +73,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(addonLifecycle); serviceCollection.AddSingleton(keyState); serviceCollection.AddSingleton(contextMenu); + serviceCollection.AddSingleton(toastGui); serviceCollection.AddSingleton(new WindowSystem(nameof(Questionable))); serviceCollection.AddSingleton((Configuration?)pluginInterface.GetPluginConfig() ?? new Configuration()); @@ -96,6 +98,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin private static void AddBasicFunctionsAndData(ServiceCollection serviceCollection) { + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -149,12 +152,16 @@ public sealed class QuestionablePlugin : IDalamudPlugin .AddTaskWithFactory(); serviceCollection.AddTaskWithFactory(); + serviceCollection.AddTaskWithFactory(); serviceCollection.AddTaskWithFactory(); serviceCollection .AddTaskWithFactory(); serviceCollection - .AddTaskWithFactory(); serviceCollection diff --git a/Questionable/Windows/JournalProgressWindow.cs b/Questionable/Windows/JournalProgressWindow.cs index 2d19c1be..bf00be39 100644 --- a/Questionable/Windows/JournalProgressWindow.cs +++ b/Questionable/Windows/JournalProgressWindow.cs @@ -190,7 +190,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable } } - private void DrawQuest(QuestInfo questInfo) + private void DrawQuest(IQuestInfo questInfo) { _questRegistry.TryGetQuest(questInfo.QuestId, out var quest); @@ -200,7 +200,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable ImGuiTreeNodeFlags.Leaf | ImGuiTreeNodeFlags.NoTreePushOnOpen | ImGuiTreeNodeFlags.SpanFullWidth); - if (ImGui.IsItemClicked() && _commandManager.Commands.TryGetValue("/questinfo", out var commandInfo)) + if (questInfo is QuestInfo && ImGui.IsItemClicked() && _commandManager.Commands.TryGetValue("/questinfo", out var commandInfo)) { _commandManager.DispatchCommand("/questinfo", questInfo.QuestId.ToString() ?? string.Empty, commandInfo); } @@ -308,7 +308,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable return new FilteredGenre(genre, genre.Quests); else { - List filteredQuests = genre.Quests + List filteredQuests = genre.Quests .Where(x => match(x.Name)) .ToList(); if (filteredQuests.Count > 0) @@ -378,5 +378,5 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable private sealed record FilteredCategory(JournalData.Category Category, List Genres); - private sealed record FilteredGenre(JournalData.Genre Genre, List Quests); + private sealed record FilteredGenre(JournalData.Genre Genre, List Quests); } diff --git a/Questionable/Windows/QuestComponents/ARealmRebornComponent.cs b/Questionable/Windows/QuestComponents/ARealmRebornComponent.cs index a94f253b..6d139a16 100644 --- a/Questionable/Windows/QuestComponents/ARealmRebornComponent.cs +++ b/Questionable/Windows/QuestComponents/ARealmRebornComponent.cs @@ -16,9 +16,6 @@ internal sealed class ARealmRebornComponent private static readonly QuestId GoodIntentions = new(363); private static readonly ushort[] RequiredPrimalInstances = [20004, 20006, 20005]; - private static readonly QuestId[] RequiredAllianceRaidQuests = - [new(1709), new(1200), new(1201), new(1202), new(1203), new(1474), new(494), new(495)]; - private readonly QuestFunctions _questFunctions; private readonly QuestData _questData; private readonly TerritoryData _territoryData; @@ -64,7 +61,7 @@ internal sealed class ARealmRebornComponent private void DrawAllianceRaids() { - bool complete = _questFunctions.IsQuestComplete(RequiredAllianceRaidQuests.Last()); + bool complete = _questFunctions.IsQuestComplete(QuestData.CrystalTowerQuests[^1]); bool hover = _uiUtils.ChecklistItem("Crystal Tower Raids", complete); if (complete || !hover) return; @@ -73,7 +70,7 @@ internal sealed class ARealmRebornComponent if (!tooltip) return; - foreach (var questId in RequiredAllianceRaidQuests) + foreach (var questId in QuestData.CrystalTowerQuests) { (Vector4 color, FontAwesomeIcon icon, _) = _uiUtils.GetQuestStyle(questId); _uiUtils.ChecklistItem(_questData.GetQuestInfo(questId).Name, color, icon); diff --git a/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs b/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs index bd5802ae..e3695a33 100644 --- a/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs +++ b/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs @@ -1,5 +1,4 @@ using System; -using System.Globalization; using System.Linq; using System.Numerics; using Dalamud.Game.Text; @@ -9,7 +8,6 @@ using Dalamud.Interface.Components; using Dalamud.Interface.Utility.Raii; using Dalamud.Plugin; using Dalamud.Plugin.Services; -using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; using ImGuiNET; using Questionable.Controller; using Questionable.Controller.Steps.Shared; @@ -27,7 +25,6 @@ internal sealed class ActiveQuestComponent private readonly GatheringController _gatheringController; private readonly QuestFunctions _questFunctions; private readonly ICommandManager _commandManager; - private readonly IDalamudPluginInterface _pluginInterface; private readonly Configuration _configuration; private readonly QuestRegistry _questRegistry; private readonly IChatGui _chatGui; @@ -39,7 +36,6 @@ internal sealed class ActiveQuestComponent GatheringController gatheringController, QuestFunctions questFunctions, ICommandManager commandManager, - IDalamudPluginInterface pluginInterface, Configuration configuration, QuestRegistry questRegistry, IChatGui chatGui) @@ -50,13 +46,14 @@ internal sealed class ActiveQuestComponent _gatheringController = gatheringController; _questFunctions = questFunctions; _commandManager = commandManager; - _pluginInterface = pluginInterface; _configuration = configuration; _questRegistry = questRegistry; _chatGui = chatGui; } - public void Draw() + public event EventHandler? Reload; + + public void Draw(bool isMinimized) { var currentQuestDetails = _questController.CurrentQuestDetails; QuestController.QuestProgress? currentQuest = currentQuestDetails?.Progress; @@ -64,7 +61,7 @@ internal sealed class ActiveQuestComponent if (currentQuest != null) { DrawQuestNames(currentQuest, currentQuestType); - var questWork = DrawQuestWork(currentQuest); + var questWork = DrawQuestWork(currentQuest, isMinimized); if (_combatController.IsRunning) ImGui.TextColored(ImGuiColors.DalamudOrange, "In Combat"); @@ -77,28 +74,32 @@ internal sealed class ActiveQuestComponent QuestSequence? currentSequence = currentQuest.Quest.FindSequence(currentQuest.Sequence); QuestStep? currentStep = currentSequence?.FindStep(currentQuest.Step); - bool colored = currentStep is - { InteractionType: EInteractionType.Instruction or EInteractionType.WaitForManualProgress }; - if (colored) - ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudOrange); - ImGui.TextUnformatted(currentStep?.Comment ?? - currentSequence?.Comment ?? currentQuest.Quest.Root.Comment ?? string.Empty); - if (colored) - ImGui.PopStyleColor(); + if (!isMinimized) + { + bool colored = currentStep is + { InteractionType: EInteractionType.Instruction or EInteractionType.WaitForManualProgress }; + if (colored) + ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudOrange); + ImGui.TextUnformatted(currentStep?.Comment ?? + currentSequence?.Comment ?? currentQuest.Quest.Root.Comment ?? string.Empty); + if (colored) + ImGui.PopStyleColor(); - //var nextStep = _questController.GetNextStep(); - //ImGui.BeginDisabled(nextStep.Step == null); - ImGui.Text(_questController.ToStatString()); - //ImGui.EndDisabled(); + //var nextStep = _questController.GetNextStep(); + //ImGui.BeginDisabled(nextStep.Step == null); + ImGui.Text(_questController.ToStatString()); + //ImGui.EndDisabled(); + } - DrawQuestButtons(currentQuest, currentStep, questWork); + DrawQuestButtons(currentQuest, currentStep, questWork, isMinimized); DrawSimulationControls(); } else { ImGui.Text("No active quest"); - ImGui.TextColored(ImGuiColors.DalamudGrey, $"{_questRegistry.Count} quests loaded"); + if (!isMinimized) + ImGui.TextColored(ImGuiColors.DalamudGrey, $"{_questRegistry.Count} quests loaded"); if (ImGuiComponents.IconButton(FontAwesomeIcon.Stop)) { @@ -157,11 +158,16 @@ internal sealed class ActiveQuestComponent } } - private QuestProgressInfo? DrawQuestWork(QuestController.QuestProgress currentQuest) + private QuestProgressInfo? DrawQuestWork(QuestController.QuestProgress currentQuest, bool isMinimized) { var questWork = _questFunctions.GetQuestProgressInfo(currentQuest.Quest.Id); + if (questWork != null) { + if (isMinimized) + return questWork; + + Vector4 color; unsafe { @@ -203,7 +209,7 @@ internal sealed class ActiveQuestComponent } private void DrawQuestButtons(QuestController.QuestProgress currentQuest, QuestStep? currentStep, - QuestProgressInfo? questProgressInfo) + QuestProgressInfo? questProgressInfo, bool isMinimized) { ImGui.BeginDisabled(_questController.IsRunning); if (ImGuiComponents.IconButton(FontAwesomeIcon.Play)) @@ -212,14 +218,17 @@ internal sealed class ActiveQuestComponent if (questProgressInfo == null) _questController.SetNextQuest(currentQuest.Quest); - _questController.ExecuteNextStep(QuestController.EAutomationType.Automatic); + _questController.Start("UI start"); } - ImGui.SameLine(); - - if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.StepForward, "Step")) + if (!isMinimized) { - _questController.ExecuteNextStep(QuestController.EAutomationType.Manual); + ImGui.SameLine(); + + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.StepForward, "Step")) + { + _questController.StartSingleStep("UI step"); + } } ImGui.EndDisabled(); @@ -228,43 +237,45 @@ internal sealed class ActiveQuestComponent if (ImGuiComponents.IconButton(FontAwesomeIcon.Stop)) { _movementController.Stop(); - _questController.Stop("Manual"); - _gatheringController.Stop("Manual"); + _questController.Stop("UI stop"); + _gatheringController.Stop("UI stop"); } - bool lastStep = currentStep == - currentQuest.Quest.FindSequence(currentQuest.Sequence)?.Steps.LastOrDefault(); - bool colored = currentStep != null - && !lastStep - && currentStep.InteractionType == EInteractionType.Instruction - && _questController.HasCurrentTaskMatching(out _); - - ImGui.BeginDisabled(lastStep); - if (colored) - ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.ParsedGreen); - if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.ArrowCircleRight, "Skip")) - { - _movementController.Stop(); - _questController.Skip(currentQuest.Quest.Id, currentQuest.Sequence); - } - - if (colored) - ImGui.PopStyleColor(); - ImGui.EndDisabled(); - - if (_commandManager.Commands.TryGetValue("/questinfo", out var commandInfo)) + if (isMinimized) { ImGui.SameLine(); - if (ImGuiComponents.IconButton(FontAwesomeIcon.Atlas)) - _commandManager.DispatchCommand("/questinfo", - currentQuest.Quest.Id.ToString() ?? string.Empty, commandInfo); + if (ImGuiComponents.IconButton(FontAwesomeIcon.RedoAlt)) + Reload?.Invoke(this, EventArgs.Empty); } - - bool autoAcceptNextQuest = _configuration.General.AutoAcceptNextQuest; - if (ImGui.Checkbox("Automatically accept next quest", ref autoAcceptNextQuest)) + else { - _configuration.General.AutoAcceptNextQuest = autoAcceptNextQuest; - _pluginInterface.SavePluginConfig(_configuration); + bool lastStep = currentStep == + currentQuest.Quest.FindSequence(currentQuest.Sequence)?.Steps.LastOrDefault(); + bool colored = currentStep != null + && !lastStep + && currentStep.InteractionType == EInteractionType.Instruction + && _questController.HasCurrentTaskMatching(out _); + + ImGui.BeginDisabled(lastStep); + if (colored) + ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.ParsedGreen); + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.ArrowCircleRight, "Skip")) + { + _movementController.Stop(); + _questController.Skip(currentQuest.Quest.Id, currentQuest.Sequence); + } + + if (colored) + ImGui.PopStyleColor(); + ImGui.EndDisabled(); + + if (_commandManager.Commands.TryGetValue("/questinfo", out var commandInfo)) + { + ImGui.SameLine(); + if (ImGuiComponents.IconButton(FontAwesomeIcon.Atlas)) + _commandManager.DispatchCommand("/questinfo", + currentQuest.Quest.Id.ToString() ?? string.Empty, commandInfo); + } } } diff --git a/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs b/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs index 61bb0563..52bcd659 100644 --- a/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs +++ b/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs @@ -119,10 +119,10 @@ internal sealed class CreationUtilsComponent ImGui.Text($"Ico: {director->IconId}"); if (director->EventHandlerInfo != null) { - ImGui.Text($" EHI: {director->EventHandlerInfo->EventId.ContentId}"); - ImGui.Text($" EHI: {director->EventHandlerInfo->EventId.Id}"); - ImGui.Text($" EHI: {director->EventHandlerInfo->EventId.EntryId}"); - ImGui.Text($" EHI: {director->EventHandlerInfo->Flags}"); + ImGui.Text($" EHI CI: {director->EventHandlerInfo->EventId.ContentId}"); + ImGui.Text($" EHI EI: {director->EventHandlerInfo->EventId.Id}"); + ImGui.Text($" EHI EEI: {director->EventHandlerInfo->EventId.EntryId}"); + ImGui.Text($" EHI F: {director->EventHandlerInfo->Flags}"); } } #endif diff --git a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs index df2a243b..65bcf240 100644 --- a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs +++ b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs @@ -94,15 +94,22 @@ internal sealed class QuestTooltipComponent foreach (var q in quest.PreviousQuests) { - var qInfo = _questData.GetQuestInfo(q); - var (iconColor, icon, _) = _uiUtils.GetQuestStyle(q); - if (!_questRegistry.IsKnownQuest(qInfo.QuestId)) - iconColor = ImGuiColors.DalamudGrey; + if (_questData.TryGetQuestInfo(q, out var qInfo)) + { + var (iconColor, icon, _) = _uiUtils.GetQuestStyle(q); + if (!_questRegistry.IsKnownQuest(qInfo.QuestId)) + iconColor = ImGuiColors.DalamudGrey; - _uiUtils.ChecklistItem(FormatQuestUnlockName(qInfo), iconColor, icon); + _uiUtils.ChecklistItem(FormatQuestUnlockName(qInfo), iconColor, icon); - if (qInfo is QuestInfo qstInfo && (counter <= 2 || icon != FontAwesomeIcon.Check)) - DrawQuestUnlocks(qstInfo, counter + 1); + if (qInfo is QuestInfo qstInfo && (counter <= 2 || icon != FontAwesomeIcon.Check)) + DrawQuestUnlocks(qstInfo, counter + 1); + } + else + { + using var _ = ImRaii.Disabled(); + _uiUtils.ChecklistItem($"Unknown Quest ({q})", ImGuiColors.DalamudGrey, FontAwesomeIcon.Question); + } } } diff --git a/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs b/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs index c1896861..6704b594 100644 --- a/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs +++ b/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs @@ -18,9 +18,7 @@ namespace Questionable.Windows.QuestComponents; internal sealed class QuickAccessButtonsComponent { - private readonly QuestController _questController; private readonly MovementController _movementController; - private readonly GameUiController _gameUiController; private readonly GameFunctions _gameFunctions; private readonly ChatFunctions _chatFunctions; private readonly QuestRegistry _questRegistry; @@ -29,12 +27,10 @@ internal sealed class QuickAccessButtonsComponent private readonly JournalProgressWindow _journalProgressWindow; private readonly IClientState _clientState; private readonly ICondition _condition; - private readonly IFramework _framework; private readonly ICommandManager _commandManager; - public QuickAccessButtonsComponent(QuestController questController, + public QuickAccessButtonsComponent( MovementController movementController, - GameUiController gameUiController, GameFunctions gameFunctions, ChatFunctions chatFunctions, QuestRegistry questRegistry, @@ -43,12 +39,9 @@ internal sealed class QuickAccessButtonsComponent JournalProgressWindow journalProgressWindow, IClientState clientState, ICondition condition, - IFramework framework, ICommandManager commandManager) { - _questController = questController; _movementController = movementController; - _gameUiController = gameUiController; _gameFunctions = gameFunctions; _chatFunctions = chatFunctions; _questRegistry = questRegistry; @@ -57,10 +50,11 @@ internal sealed class QuickAccessButtonsComponent _journalProgressWindow = journalProgressWindow; _clientState = clientState; _condition = condition; - _framework = framework; _commandManager = commandManager; } + public event EventHandler? Reload; + public unsafe void Draw() { var map = AgentMap.Instance(); @@ -89,8 +83,8 @@ internal sealed class QuickAccessButtonsComponent ImGui.SetTooltip("Hold CTRL to enable this button.\nRebuilding the navmesh will take some time."); } - if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.RedoAlt,"Reload Data")) - Reload(); + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.RedoAlt, "Reload Data")) + Reload?.Invoke(this, EventArgs.Empty); ImGui.SameLine(); if (ImGuiComponents.IconButton(FontAwesomeIcon.ChartColumn)) @@ -105,13 +99,6 @@ internal sealed class QuickAccessButtonsComponent } } - public void Reload() - { - _questController.Reload(); - _framework.RunOnTick(() => _gameUiController.HandleCurrentDialogueChoices(), - TimeSpan.FromMilliseconds(200)); - } - private bool DrawValidationIssuesButton() { int errorCount = _questRegistry.ValidationErrorCount; diff --git a/Questionable/Windows/QuestSelectionWindow.cs b/Questionable/Windows/QuestSelectionWindow.cs index 1f7c4705..48e0b333 100644 --- a/Questionable/Windows/QuestSelectionWindow.cs +++ b/Questionable/Windows/QuestSelectionWindow.cs @@ -237,7 +237,7 @@ internal sealed class QuestSelectionWindow : LWindow if (startNextQuest) { _questController.SetNextQuest(knownQuest); - _questController.ExecuteNextStep(QuestController.EAutomationType.Automatic); + _questController.Start("QuestSelectionWindow"); } ImGui.SameLine(); diff --git a/Questionable/Windows/QuestWindow.cs b/Questionable/Windows/QuestWindow.cs index dab69b8b..26891d8b 100644 --- a/Questionable/Windows/QuestWindow.cs +++ b/Questionable/Windows/QuestWindow.cs @@ -1,5 +1,6 @@ using System; using System.Numerics; +using Dalamud.Interface; using Dalamud.Plugin; using Dalamud.Plugin.Services; using ImGuiNET; @@ -24,6 +25,9 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig private readonly CreationUtilsComponent _creationUtilsComponent; private readonly QuickAccessButtonsComponent _quickAccessButtonsComponent; private readonly RemainingTasksComponent _remainingTasksComponent; + private readonly IFramework _framework; + private readonly GameUiController _gameUiController; + private readonly TitleBarButton _minimizeButton; public QuestWindow(IDalamudPluginInterface pluginInterface, QuestController questController, @@ -34,8 +38,11 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig ARealmRebornComponent aRealmRebornComponent, CreationUtilsComponent creationUtilsComponent, QuickAccessButtonsComponent quickAccessButtonsComponent, - RemainingTasksComponent remainingTasksComponent) - : base($"Questionable v{PluginVersion.ToString(2)}###Questionable", ImGuiWindowFlags.AlwaysAutoResize) + RemainingTasksComponent remainingTasksComponent, + IFramework framework, + GameUiController gameUiController) + : base($"Questionable v{PluginVersion.ToString(2)}###Questionable", + ImGuiWindowFlags.AlwaysAutoResize) { _pluginInterface = pluginInterface; _questController = questController; @@ -47,6 +54,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig _creationUtilsComponent = creationUtilsComponent; _quickAccessButtonsComponent = quickAccessButtonsComponent; _remainingTasksComponent = remainingTasksComponent; + _framework = framework; + _gameUiController = gameUiController; #if DEBUG IsOpen = true; @@ -57,15 +66,44 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig MaximumSize = default }; RespectCloseHotkey = false; + AllowClickthrough = false; + + _minimizeButton = new TitleBarButton + { + Icon = FontAwesomeIcon.Minus, + Priority = int.MinValue, + IconOffset = new Vector2(1.5f, 1), + Click = _ => + { + IsMinimized = !IsMinimized; + _minimizeButton!.Icon = IsMinimized ? FontAwesomeIcon.WindowMaximize : FontAwesomeIcon.Minus; + }, + AvailableClickthrough = true, + }; + TitleBarButtons.Insert(0, _minimizeButton); + + _activeQuestComponent.Reload += OnReload; + _quickAccessButtonsComponent.Reload += OnReload; } public WindowConfig WindowConfig => _configuration.DebugWindowConfig; + public bool IsMinimized { get; set; } public void SaveWindowConfig() => _pluginInterface.SavePluginConfig(_configuration); public override void PreOpenCheck() { - IsOpen |= _questController.IsRunning; + if (_questController.IsRunning) + { + IsOpen = true; + Flags |= ImGuiWindowFlags.NoCollapse; + ShowCloseButton = false; + } + else + { + Flags &= ~ImGuiWindowFlags.NoCollapse; + ShowCloseButton = true; + } } public override bool DrawConditions() @@ -82,19 +120,31 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig public override void Draw() { - _activeQuestComponent.Draw(); - ImGui.Separator(); - - if (_aRealmRebornComponent.ShouldDraw) + _activeQuestComponent.Draw(IsMinimized); + if (!IsMinimized) { - _aRealmRebornComponent.Draw(); ImGui.Separator(); + + if (_aRealmRebornComponent.ShouldDraw) + { + _aRealmRebornComponent.Draw(); + ImGui.Separator(); + } + + _creationUtilsComponent.Draw(); + ImGui.Separator(); + + _quickAccessButtonsComponent.Draw(); + _remainingTasksComponent.Draw(); } + } - _creationUtilsComponent.Draw(); - ImGui.Separator(); + private void OnReload(object? sender, EventArgs e) => Reload(); - _quickAccessButtonsComponent.Draw(); - _remainingTasksComponent.Draw(); + internal void Reload() + { + _questController.Reload(); + _framework.RunOnTick(() => _gameUiController.HandleCurrentDialogueChoices(), + TimeSpan.FromMilliseconds(200)); } }