From 001a9f01910aadd18bec852e869b21e3f2b4f528 Mon Sep 17 00:00:00 2001 From: Jackson <9527380+Jaksuhn@users.noreply.github.com> Date: Thu, 19 Dec 2024 16:41:17 +0100 Subject: [PATCH 001/109] add vbm as a combatmodule --- .../Controller/CombatModules/BossModModule.cs | 117 ++++++ .../CombatModules/BossModPreset.json | 377 ++++++++++++++++++ Questionable/Questionable.csproj | 7 + Questionable/QuestionablePlugin.cs | 1 + 4 files changed, 502 insertions(+) create mode 100644 Questionable/Controller/CombatModules/BossModModule.cs create mode 100644 Questionable/Controller/CombatModules/BossModPreset.json diff --git a/Questionable/Controller/CombatModules/BossModModule.cs b/Questionable/Controller/CombatModules/BossModModule.cs new file mode 100644 index 000000000..0d04cce18 --- /dev/null +++ b/Questionable/Controller/CombatModules/BossModModule.cs @@ -0,0 +1,117 @@ +using Dalamud.Game.ClientState.Objects.Types; +using Dalamud.Plugin; +using Dalamud.Plugin.Ipc; +using Dalamud.Plugin.Ipc.Exceptions; +using Dalamud.Plugin.Services; +using Microsoft.Extensions.Logging; +using Questionable.Model; +using System; +using System.IO; +using System.Numerics; + +namespace Questionable.Controller.CombatModules; + +internal sealed class BossModModule(ILogger logger, MovementController movementController, IClientState clientState, IDalamudPluginInterface pluginInterface) : ICombatModule, IDisposable +{ + private const string Name = "BossMod"; + private readonly ILogger _logger = logger; + private readonly MovementController _movementController = movementController; + private readonly IClientState _clientState = clientState; + private readonly ICallGateSubscriber _getPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.Get"); + private readonly ICallGateSubscriber _createPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.Create"); + private readonly ICallGateSubscriber _setPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.SetActive"); + private readonly ICallGateSubscriber _clearPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.ClearActive"); + + private DateTime _lastDistanceCheck = DateTime.MinValue; + + public bool CanHandleFight(CombatController.CombatData combatData) + { + try + { + return _getPreset.HasFunction; + } + catch (IpcError) + { + return false; + } + } + + public bool Start(CombatController.CombatData combatData) + { + try + { + _logger.LogInformation("Starting {Name}", Name); + var path = Path.Combine(pluginInterface.AssemblyLocation.DirectoryName!, @"Controller\CombatModules\BossModPreset.json"); + if (_getPreset.InvokeFunc("Questionable") == null) + _logger.LogInformation("Loading Questionable BossMod Preset: {LoadedState}", _createPreset.InvokeFunc(File.ReadAllText(path), true)); + _setPreset.InvokeFunc("Questionable"); + _lastDistanceCheck = DateTime.Now; + return true; + } + catch (IpcError e) + { + _logger.LogWarning(e, "Could not start combat"); + return false; + } + } + + public bool Stop() + { + try + { + _clearPreset.InvokeFunc(); + return true; + } + catch (IpcError e) + { + _logger.LogWarning(e, "Could not turn off combat"); + return false; + } + } + + public void MoveToTarget(IGameObject gameObject) + { + var player = _clientState.LocalPlayer; + if (player == null) + return; // uh oh + + float hitboxOffset = player.HitboxRadius + gameObject.HitboxRadius; + float actualDistance = Vector3.Distance(player.Position, gameObject.Position); + float maxDistance = player.ClassJob.ValueNullable?.Role is 3 or 4 ? 20f : 2.9f; + if (actualDistance - hitboxOffset >= maxDistance) + { + if (actualDistance - hitboxOffset <= 5) + { + _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack", gameObject.Name, + gameObject.DataId); + _movementController.NavigateTo(EMovementType.Combat, null, [gameObject.Position], false, false, + maxDistance + hitboxOffset - 0.25f, true); + } + else + { + _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack (with navmesh)", gameObject.Name, + gameObject.DataId); + _movementController.NavigateTo(EMovementType.Combat, null, gameObject.Position, false, false, + maxDistance + hitboxOffset - 0.25f, true); + } + } + + _lastDistanceCheck = DateTime.Now; + } + + public void Update(IGameObject gameObject) + { + if (_movementController.IsPathfinding || _movementController.IsPathRunning) + return; + + if (DateTime.Now > _lastDistanceCheck.AddSeconds(10)) + { + MoveToTarget(gameObject); + _lastDistanceCheck = DateTime.Now; + } + } + + public bool CanAttack(IBattleNpc target) => true; + + public void Dispose() => Stop(); +} diff --git a/Questionable/Controller/CombatModules/BossModPreset.json b/Questionable/Controller/CombatModules/BossModPreset.json new file mode 100644 index 000000000..b6c6a28ae --- /dev/null +++ b/Questionable/Controller/CombatModules/BossModPreset.json @@ -0,0 +1,377 @@ +{ + "Name": "Questionable", + "Modules": { + "BossMod.Autorotation.xan.DNC": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.MCH": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.MNK": [ + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.PCT": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + }, + { + "Track": "Motifs", + "Option": "Downtime" + } + ], + "BossMod.Autorotation.xan.PLD": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.SAM": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.SGE": [ + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.VPR": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.NIN": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.GNB": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.SMN": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.DRK": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.RPR": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.WHM": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.AST": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.BRD": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.SCH": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.BLM": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.StandardWAR": [ + { + "Track": "AOE", + "Option": "AutoFinishCombo" + } + ], + "BossMod.Autorotation.xan.RDM": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ], + "BossMod.Autorotation.xan.DRG": [ + { + "Track": "Buffs", + "Option": "Auto" + }, + { + "Track": "Buffs", + "Option": "Delay", + "Mod": "Shift, Ctrl" + }, + { + "Track": "AOE", + "Option": "AOE" + }, + { + "Track": "Targeting", + "Option": "Manual" + } + ] + } +} \ No newline at end of file diff --git a/Questionable/Questionable.csproj b/Questionable/Questionable.csproj index 6d44ba067..eb91f928b 100644 --- a/Questionable/Questionable.csproj +++ b/Questionable/Questionable.csproj @@ -23,4 +23,11 @@ + + + + + PreserveNewest + + diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 8e4ad410f..73af794f6 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -247,6 +247,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); } From 1dc1cef6370c5a2dac67fa3b13de35e0e6cf3427 Mon Sep 17 00:00:00 2001 From: Jackson <9527380+Jaksuhn@users.noreply.github.com> Date: Thu, 19 Dec 2024 17:40:09 +0100 Subject: [PATCH 002/109] swap to embeddedresource --- Questionable/Controller/CombatModules/BossModModule.cs | 9 ++++++--- Questionable/Questionable.csproj | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Questionable/Controller/CombatModules/BossModModule.cs b/Questionable/Controller/CombatModules/BossModModule.cs index 0d04cce18..a26d1c745 100644 --- a/Questionable/Controller/CombatModules/BossModModule.cs +++ b/Questionable/Controller/CombatModules/BossModModule.cs @@ -3,6 +3,7 @@ using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Ipc.Exceptions; using Dalamud.Plugin.Services; +using Json.Schema; using Microsoft.Extensions.Logging; using Questionable.Model; using System; @@ -22,6 +23,7 @@ internal sealed class BossModModule(ILogger logger, MovementContr private readonly ICallGateSubscriber _setPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.SetActive"); private readonly ICallGateSubscriber _clearPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.ClearActive"); + private static Stream Preset => typeof(BossModModule).Assembly.GetManifestResourceStream("Questionable.Controller.CombatModules.BossModPreset")!; private DateTime _lastDistanceCheck = DateTime.MinValue; public bool CanHandleFight(CombatController.CombatData combatData) @@ -40,10 +42,11 @@ internal sealed class BossModModule(ILogger logger, MovementContr { try { - _logger.LogInformation("Starting {Name}", Name); - var path = Path.Combine(pluginInterface.AssemblyLocation.DirectoryName!, @"Controller\CombatModules\BossModPreset.json"); if (_getPreset.InvokeFunc("Questionable") == null) - _logger.LogInformation("Loading Questionable BossMod Preset: {LoadedState}", _createPreset.InvokeFunc(File.ReadAllText(path), true)); + { + using var reader = new StreamReader(Preset); + _logger.LogInformation("Loading Questionable BossMod Preset: {LoadedState}", _createPreset.InvokeFunc(reader.ReadToEnd(), true)); + } _setPreset.InvokeFunc("Questionable"); _lastDistanceCheck = DateTime.Now; return true; diff --git a/Questionable/Questionable.csproj b/Questionable/Questionable.csproj index eb91f928b..544ba74e8 100644 --- a/Questionable/Questionable.csproj +++ b/Questionable/Questionable.csproj @@ -26,8 +26,8 @@ - - PreserveNewest - + + Questionable.Controller.CombatModules.BossModPreset + From 6b38e37271abf49bbe6740636738e1858389c9fe Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 21 Dec 2024 15:04:31 +0100 Subject: [PATCH 003/109] Allied Society daily 'quest', part 1 --- .../Vanu Vanu/A6_Vanu Vanu (all).json | 29 +++++++++ .../Dailies/2172_Pussyfooting About.json | 14 ++++- .../Allied Societies/Vath/A7_Vath.json | 27 +++++++++ Questionable.Model/Questing/ElementId.cs | 27 ++++++++- Questionable/Controller/CommandHandler.cs | 1 + Questionable/Data/QuestData.cs | 23 +++++++ Questionable/Functions/QuestFunctions.cs | 14 ++++- Questionable/Model/AlliedSocietyDailyInfo.cs | 60 +++++++++++++++++++ Questionable/Windows/PriorityWindow.cs | 2 +- 9 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/A6_Vanu Vanu (all).json create mode 100644 QuestPaths/3.x - Heavensward/Allied Societies/Vath/A7_Vath.json create mode 100644 Questionable/Model/AlliedSocietyDailyInfo.cs diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/A6_Vanu Vanu (all).json b/QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/A6_Vanu Vanu (all).json new file mode 100644 index 000000000..036c29822 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/A6_Vanu Vanu (all).json @@ -0,0 +1,29 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1016089, + "Position": { + "X": -799.46594, + "Y": -133.2695, + "Z": -404.1352 + }, + "StopDistance": 3, + "TerritoryId": 401, + "InteractionType": "WalkTo", + "AetheryteShortcut": "The Sea of Clouds - Ok' Zundu", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/Dailies/2172_Pussyfooting About.json b/QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/Dailies/2172_Pussyfooting About.json index fab39d1f3..e12ff08c8 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/Dailies/2172_Pussyfooting About.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Vanu Vanu/Dailies/2172_Pussyfooting About.json @@ -58,6 +58,17 @@ { "Sequence": 2, "Steps": [ + { + "Position": { + "X": -799.46594, + "Y": -133.2695, + "Z": -404.1352 + }, + "TerritoryId": 401, + "InteractionType": "WalkTo", + "AetheryteShortcut": "The Sea of Clouds - Ok' Zundu", + "Fly": true + }, { "DataId": 1016089, "Position": { @@ -67,8 +78,7 @@ }, "TerritoryId": 401, "InteractionType": "Interact", - "AetheryteShortcut": "The Sea of Clouds - Ok' Zundu", - "Fly": true + "Mount": false } ] }, diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Vath/A7_Vath.json b/QuestPaths/3.x - Heavensward/Allied Societies/Vath/A7_Vath.json new file mode 100644 index 000000000..6ffe879dd --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Vath/A7_Vath.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 58.39701, + "Y": -48.000008, + "Z": -172.36507 + }, + "TerritoryId": 398, + "InteractionType": "WalkTo", + "AetheryteShortcut": "The Dravanian Forelands - Anyx Trine", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + } + ] +} diff --git a/Questionable.Model/Questing/ElementId.cs b/Questionable.Model/Questing/ElementId.cs index 396c3524b..a553ff0d3 100644 --- a/Questionable.Model/Questing/ElementId.cs +++ b/Questionable.Model/Questing/ElementId.cs @@ -56,6 +56,19 @@ public abstract class ElementId : IComparable, IEquatable return new LeveId(ushort.Parse(value.Substring(1), CultureInfo.InvariantCulture)); else if (value.StartsWith("S")) return new SatisfactionSupplyNpcId(ushort.Parse(value.Substring(1), CultureInfo.InvariantCulture)); + else if (value.StartsWith("A")) + { + value = value.Substring(1); + string[] parts = value.Split('x'); + if (parts.Length == 2) + { + return new AlliedSocietyDailyId( + byte.Parse(parts[0], CultureInfo.InvariantCulture), + byte.Parse(parts[1], CultureInfo.InvariantCulture)); + } + else + return new AlliedSocietyDailyId(byte.Parse(value, CultureInfo.InvariantCulture)); + } else return new QuestId(ushort.Parse(value, CultureInfo.InvariantCulture)); } @@ -70,7 +83,8 @@ public abstract class ElementId : IComparable, IEquatable catch (Exception) { elementId = null; - return false; + //return false; + throw; } } } @@ -98,3 +112,14 @@ public sealed class SatisfactionSupplyNpcId(ushort value) : ElementId(value) return "S" + Value.ToString(CultureInfo.InvariantCulture); } } + +public sealed class AlliedSocietyDailyId(byte alliedSociety, byte rank = 0) : ElementId((ushort)(alliedSociety * 10 + rank)) +{ + public byte AlliedSociety { get; } = alliedSociety; + public byte Rank { get; } = rank; + + public override string ToString() + { + return "A" + AlliedSociety + "x" + Rank; + } +} diff --git a/Questionable/Controller/CommandHandler.cs b/Questionable/Controller/CommandHandler.cs index c6085a18d..1c2bed2bd 100644 --- a/Questionable/Controller/CommandHandler.cs +++ b/Questionable/Controller/CommandHandler.cs @@ -4,6 +4,7 @@ using Dalamud.Game.ClientState.Objects; using Dalamud.Game.Command; using Dalamud.Plugin.Services; using Lumina.Excel.Sheets; +using Microsoft.Extensions.Logging; using Questionable.Functions; using Questionable.Model.Questing; using Questionable.Windows; diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index 5d7b70229..3cb2f295a 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -68,6 +68,29 @@ internal sealed class QuestData .Where(x => x.LevelLevemete.RowId != 0) .Select(x => new LeveInfo(x)), ]; + + quests.AddRange( + dataManager.GetExcelSheet() + .Where(x => x.RowId > 0 && !x.Name.IsEmpty) + .SelectMany(x => + { + if (x.RowId < 5) + { + return ((IEnumerable) + [ + 0, + ..quests.Where(y => y.AlliedSociety == (EAlliedSociety)x.RowId && y.IsRepeatable) + .Cast() + .Select(y => (byte)y.AlliedSocietyRank).Distinct() + ]) + .Select(rank => new AlliedSocietyDailyInfo(x, rank)); + } + else + { + return [new AlliedSocietyDailyInfo(x, 0)]; + } + })); + _quests = quests.ToDictionary(x => x.QuestId, x => x); // workaround because the game doesn't require completion of the CT questline through normal means diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index bb206a1b9..fc5d7935c 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -14,7 +14,6 @@ using LLib.GameData; using LLib.GameUI; using Lumina.Excel.Sheets; using Questionable.Controller; -using Questionable.Controller.Steps.Interactions; using Questionable.Data; using Questionable.Model; using Questionable.Model.Questing; @@ -487,6 +486,8 @@ internal sealed unsafe class QuestFunctions return IsQuestAccepted(leveId); else if (elementId is SatisfactionSupplyNpcId) return false; + else if (elementId is AlliedSocietyDailyId) + return false; else throw new ArgumentOutOfRangeException(nameof(elementId)); } @@ -517,6 +518,8 @@ internal sealed unsafe class QuestFunctions return IsQuestComplete(leveId); else if (elementId is SatisfactionSupplyNpcId) return false; + else if (elementId is AlliedSocietyDailyId) + return false; else throw new ArgumentOutOfRangeException(nameof(elementId)); } @@ -540,6 +543,8 @@ internal sealed unsafe class QuestFunctions return IsQuestLocked(leveId); else if (elementId is SatisfactionSupplyNpcId satisfactionSupplyNpcId) return IsQuestLocked(satisfactionSupplyNpcId); + else if (elementId is AlliedSocietyDailyId alliedSocietyDailyId) + return IsQuestLocked(alliedSocietyDailyId); else throw new ArgumentOutOfRangeException(nameof(elementId)); } @@ -579,6 +584,13 @@ internal sealed unsafe class QuestFunctions return !HasCompletedPreviousQuests(questInfo, null); } + private bool IsQuestLocked(AlliedSocietyDailyId alliedSocietyDailyId) + { + PlayerState* playerState = PlayerState.Instance(); + byte currentRank = playerState->GetBeastTribeRank(alliedSocietyDailyId.AlliedSociety); + return currentRank == 0 || currentRank < alliedSocietyDailyId.Rank; + } + public bool IsDailyAlliedSocietyQuest(QuestId questId) { var questInfo = (QuestInfo)_questData.GetQuestInfo(questId); diff --git a/Questionable/Model/AlliedSocietyDailyInfo.cs b/Questionable/Model/AlliedSocietyDailyInfo.cs new file mode 100644 index 000000000..0f203609c --- /dev/null +++ b/Questionable/Model/AlliedSocietyDailyInfo.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using LLib.GameData; +using Lumina.Excel.Sheets; +using Questionable.Data; +using Questionable.Model.Questing; + +namespace Questionable.Model; + +internal sealed class AlliedSocietyDailyInfo : IQuestInfo +{ + public AlliedSocietyDailyInfo(BeastTribe beastTribe, byte rank) + { + QuestId = new AlliedSocietyDailyId((byte)beastTribe.RowId, rank); + Name = beastTribe.Name.ToString(); + ClassJobs = (EAlliedSociety)beastTribe.RowId switch + { + EAlliedSociety.Amaljaa or EAlliedSociety.Sylphs or EAlliedSociety.Kobolds or EAlliedSociety.Sahagin or + EAlliedSociety.VanuVanu or EAlliedSociety.Vath or + EAlliedSociety.Kojin or EAlliedSociety.Ananta or + EAlliedSociety.Pixies or + EAlliedSociety.Arkasodara or + EAlliedSociety.Pelupelu => + [ + ..ClassJobUtils.AsIndividualJobs(EExtendedClassJob.DoW), + ..ClassJobUtils.AsIndividualJobs(EExtendedClassJob.DoM) + ], + EAlliedSociety.Ixal or EAlliedSociety.Moogles or EAlliedSociety.Dwarves or EAlliedSociety.Loporrits => + ClassJobUtils.AsIndividualJobs(EExtendedClassJob.DoH).ToList(), + + EAlliedSociety.Qitari or EAlliedSociety.Omicrons => + ClassJobUtils.AsIndividualJobs(EExtendedClassJob.DoL).ToList(), + + EAlliedSociety.Namazu => + [ + ..ClassJobUtils.AsIndividualJobs(EExtendedClassJob.DoH), + ..ClassJobUtils.AsIndividualJobs(EExtendedClassJob.DoL) + ], + + _ => throw new ArgumentOutOfRangeException(nameof(beastTribe)) + }; + Expansion = (EExpansionVersion)beastTribe.Expansion.RowId; + } + + public ElementId QuestId { get; } + public string Name { get; } + public uint IssuerDataId => 0; + public ImmutableList PreviousQuests { get; } = []; + public EQuestJoin PreviousQuestJoin => EQuestJoin.All; + public bool IsRepeatable => true; + public ushort Level => 1; + public EAlliedSociety AlliedSociety => EAlliedSociety.None; + public uint? JournalGenre => null; + public ushort SortKey => 0; + public bool IsMainScenarioQuest => false; + public IReadOnlyList ClassJobs { get; } + public EExpansionVersion Expansion { get; } +} diff --git a/Questionable/Windows/PriorityWindow.cs b/Questionable/Windows/PriorityWindow.cs index 08bd35e59..8b4d5202a 100644 --- a/Questionable/Windows/PriorityWindow.cs +++ b/Questionable/Windows/PriorityWindow.cs @@ -106,7 +106,7 @@ internal sealed class PriorityWindow : LWindow if (!string.IsNullOrEmpty(_searchString)) { foundQuests = _questRegistry.AllQuests - .Where(x => x.Id is not SatisfactionSupplyNpcId) + .Where(x => x.Id is not SatisfactionSupplyNpcId and not AlliedSocietyDailyId) .Where(x => x.Info.Name.Contains(_searchString, StringComparison.CurrentCultureIgnoreCase)) .Where(x => !_questFunctions.IsQuestUnobtainable(x.Id)); } From d59476f7f88b0d5c497da4aeba91572fbd0be982 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 22 Dec 2024 00:43:58 +0100 Subject: [PATCH 004/109] Change how removed quests are shown in journal --- .../AlliedSocietyDailyIdExtensions.cs | 26 ++++++++++ QuestPathGenerator/RoslynShortcuts.cs | 1 + Questionable/Data/JournalData.cs | 3 -- Questionable/Data/QuestData.cs | 7 ++- Questionable/Functions/QuestFunctions.cs | 17 +++++++ .../QuestJournalComponent.cs | 48 ++++++++++++------- 6 files changed, 77 insertions(+), 25 deletions(-) create mode 100644 QuestPathGenerator/RoslynElements/AlliedSocietyDailyIdExtensions.cs diff --git a/QuestPathGenerator/RoslynElements/AlliedSocietyDailyIdExtensions.cs b/QuestPathGenerator/RoslynElements/AlliedSocietyDailyIdExtensions.cs new file mode 100644 index 000000000..535b66b33 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/AlliedSocietyDailyIdExtensions.cs @@ -0,0 +1,26 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Questionable.Model.Questing; +using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; +using static Questionable.QuestPathGenerator.RoslynShortcuts; + +namespace Questionable.QuestPathGenerator.RoslynElements; + +internal static class AlliedSocietyDailyIdExtensions +{ + public static ExpressionSyntax ToExpressionSyntax(this AlliedSocietyDailyId alliedSocietyDailyId) + { + return ObjectCreationExpression( + IdentifierName(nameof(AlliedSocietyDailyId))) + .WithArgumentList( + ArgumentList( + SeparatedList( + new SyntaxNodeOrToken[] + { + Argument(LiteralValue(alliedSocietyDailyId.AlliedSociety)), + Token(SyntaxKind.CommaToken), + Argument(LiteralValue(alliedSocietyDailyId.Rank)), + }))); + } +} diff --git a/QuestPathGenerator/RoslynShortcuts.cs b/QuestPathGenerator/RoslynShortcuts.cs index 4147e47ba..c5fb47f5b 100644 --- a/QuestPathGenerator/RoslynShortcuts.cs +++ b/QuestPathGenerator/RoslynShortcuts.cs @@ -51,6 +51,7 @@ public static class RoslynShortcuts QuestId questId => questId.ToExpressionSyntax(), LeveId leveId => leveId.ToExpressionSyntax(), SatisfactionSupplyNpcId satisfactionSupplyNpcId => satisfactionSupplyNpcId.ToExpressionSyntax(), + AlliedSocietyDailyId alliedSocietyDailyId => alliedSocietyDailyId.ToExpressionSyntax(), Vector3 vector => vector.ToExpressionSyntax(), AethernetShortcut aethernetShortcut => aethernetShortcut.ToExpressionSyntax(), ChatMessage chatMessage => chatMessage.ToExpressionSyntax(), diff --git a/Questionable/Data/JournalData.cs b/Questionable/Data/JournalData.cs index 56a12b6b1..115d806e2 100644 --- a/Questionable/Data/JournalData.cs +++ b/Questionable/Data/JournalData.cs @@ -77,7 +77,6 @@ internal sealed class JournalData public string Name { get; } public uint CategoryId { get; } public List Quests { get; } - public int QuestCount => Quests.Count; } internal sealed class Category(JournalCategory journalCategory, IReadOnlyList genres) @@ -86,7 +85,6 @@ internal sealed class JournalData public string Name { get; } = journalCategory.Name.ToString(); public uint SectionId { get; } = journalCategory.JournalSection.RowId; public IReadOnlyList Genres { get; } = genres; - public int QuestCount => Genres.Sum(x => x.QuestCount); } internal sealed class Section(JournalSection journalSection, IReadOnlyList categories) @@ -94,6 +92,5 @@ internal sealed class JournalData public uint Id { get; } = journalSection.RowId; public string Name { get; } = journalSection.Name.ToString(); public IReadOnlyList Categories { get; } = categories; - public int QuestCount => Categories.Sum(x => x.QuestCount); } } diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index 3cb2f295a..b875d700d 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -58,8 +58,7 @@ internal sealed class QuestData .Where(x => x.RowId > 0) .Where(x => x.IssuerLocation.RowId > 0) .Select(x => new QuestInfo(x, questChapters.GetValueOrDefault(x.RowId), - startingCities.GetValueOrDefault(x.RowId))) - .Where(x => x.QuestId.Value != 1428), + startingCities.GetValueOrDefault(x.RowId))), ..dataManager.GetExcelSheet() .Where(x => x is { RowId: > 0, Npc.RowId: > 0 }) .Select(x => new SatisfactionSupplyInfo(x)), @@ -186,7 +185,7 @@ internal sealed class QuestData // initial city quests are side quests // unclear if 470 can be started as the required quest isn't available anymore ushort[] limsaSideQuests = - [107, 111, 112, 122, 663, 475, 472, 476, 470, 473, 474, 477, 486, 478, 479, 487, 59, 400, 401, 693, 405]; + [107, 111, 112, 122, 663, 475, 472, 476, 470, 473, 474, 477, 486, 478, 479, 59, 400, 401, 693, 405]; foreach (var questId in limsaSideQuests) ((QuestInfo)_quests[new QuestId(questId)]).StartingCity = 1; @@ -196,7 +195,7 @@ internal sealed class QuestData ((QuestInfo)_quests[new QuestId(questId)]).StartingCity = 2; ushort[] uldahSideQuests = - [594, 389, 390, 321, 304, 322, 388, 308, 326, 1429, 58, 687, 341, 504, 531, 506, 530, 573, 342, 505]; + [594, 389, 390, 321, 304, 322, 388, 308, 326, 58, 687, 341, 504, 531, 506, 530, 573, 342, 505]; foreach (var questId in uldahSideQuests) ((QuestInfo)_quests[new QuestId(questId)]).StartingCity = 3; diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index fc5d7935c..8c937bcc9 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -670,6 +670,9 @@ internal sealed unsafe class QuestFunctions return true; } + if (IsQuestRemoved(questId)) + return true; + return false; } @@ -682,6 +685,20 @@ internal sealed unsafe class QuestFunctions return false; } + public bool IsQuestRemoved(ElementId elementId) + { + if (elementId is QuestId questId) + return IsQuestRemoved(questId); + else + return false; + } + + [SuppressMessage("Performance", "CA1822")] + private bool IsQuestRemoved(QuestId questId) + { + return questId.Value is 487 or 1428 or 1429; + } + private bool HasCompletedPreviousQuests(IQuestInfo questInfo, ElementId? extraCompletedQuest) { if (questInfo.PreviousQuests.Count == 0) diff --git a/Questionable/Windows/JournalComponents/QuestJournalComponent.cs b/Questionable/Windows/JournalComponents/QuestJournalComponent.cs index b68f9dd3a..04dc9bca8 100644 --- a/Questionable/Windows/JournalComponents/QuestJournalComponent.cs +++ b/Questionable/Windows/JournalComponents/QuestJournalComponent.cs @@ -93,18 +93,18 @@ internal sealed class QuestJournalComponent private void DrawSection(FilteredSection filter) { - if (filter.Section.QuestCount == 0) + (int available, int total, int obtainable, int completed) = + _sectionCounts.GetValueOrDefault(filter.Section, new()); + if (total == 0) return; - (int available, int obtainable, int completed) = _sectionCounts.GetValueOrDefault(filter.Section, new()); - ImGui.TableNextRow(); ImGui.TableNextColumn(); bool open = ImGui.TreeNodeEx(filter.Section.Name, ImGuiTreeNodeFlags.SpanFullWidth); ImGui.TableNextColumn(); - DrawCount(available, filter.Section.QuestCount); + DrawCount(available, total); ImGui.TableNextColumn(); DrawCount(completed, obtainable); @@ -119,18 +119,18 @@ internal sealed class QuestJournalComponent private void DrawCategory(FilteredCategory filter) { - if (filter.Category.QuestCount == 0) + (int available, int total, int obtainable, int completed) = + _categoryCounts.GetValueOrDefault(filter.Category, new()); + if (total == 0) return; - (int available, int obtainable, int completed) = _categoryCounts.GetValueOrDefault(filter.Category, new()); - ImGui.TableNextRow(); ImGui.TableNextColumn(); bool open = ImGui.TreeNodeEx(filter.Category.Name, ImGuiTreeNodeFlags.SpanFullWidth); ImGui.TableNextColumn(); - DrawCount(available, filter.Category.QuestCount); + DrawCount(available, total); ImGui.TableNextColumn(); DrawCount(completed, obtainable); @@ -145,18 +145,17 @@ internal sealed class QuestJournalComponent private void DrawGenre(FilteredGenre filter) { - if (filter.Genre.QuestCount == 0) + (int supported, int total, int obtainable, int completed) = _genreCounts.GetValueOrDefault(filter.Genre, new()); + if (total == 0) return; - (int supported, int obtainable, int completed) = _genreCounts.GetValueOrDefault(filter.Genre, new()); - ImGui.TableNextRow(); ImGui.TableNextColumn(); bool open = ImGui.TreeNodeEx(filter.Genre.Name, ImGuiTreeNodeFlags.SpanFullWidth); ImGui.TableNextColumn(); - DrawCount(supported, filter.Genre.QuestCount); + DrawCount(supported, total); ImGui.TableNextColumn(); DrawCount(completed, obtainable); @@ -194,7 +193,9 @@ internal sealed class QuestJournalComponent ImGui.SetCursorPosX(ImGui.GetCursorPosX() + spacing); - if (quest is { Root.Disabled: false }) + if (_questFunctions.IsQuestRemoved(questInfo.QuestId)) + _uiUtils.ChecklistItem(string.Empty, ImGuiColors.DalamudGrey, FontAwesomeIcon.Minus); + else if (quest is { Root.Disabled: false }) { List issues = _questValidator.GetIssues(quest.Id); if (issues.Any(x => x.Severity == EIssueSeverity.Error)) @@ -319,10 +320,13 @@ internal sealed class QuestJournalComponent foreach (var genre in _journalData.Genres) { int available = genre.Quests.Count(x => - _questRegistry.TryGetQuest(x.QuestId, out var quest) && !quest.Root.Disabled); + _questRegistry.TryGetQuest(x.QuestId, out var quest) && + !quest.Root.Disabled && + !_questFunctions.IsQuestRemoved(x.QuestId)); + int total = genre.Quests.Count(x => !_questFunctions.IsQuestRemoved(x.QuestId)); int obtainable = genre.Quests.Count(x => !_questFunctions.IsQuestUnobtainable(x.QuestId)); int completed = genre.Quests.Count(x => _questFunctions.IsQuestComplete(x.QuestId)); - _genreCounts[genre] = new(available, obtainable, completed); + _genreCounts[genre] = new(available, total, obtainable, completed); } foreach (var category in _journalData.Categories) @@ -332,9 +336,10 @@ internal sealed class QuestJournalComponent .Select(x => x.Value) .ToList(); int available = counts.Sum(x => x.Available); + int total = counts.Sum(x => x.Total); int obtainable = counts.Sum(x => x.Obtainable); int completed = counts.Sum(x => x.Completed); - _categoryCounts[category] = new(available, obtainable, completed); + _categoryCounts[category] = new(available, total, obtainable, completed); } foreach (var section in _journalData.Sections) @@ -344,9 +349,10 @@ internal sealed class QuestJournalComponent .Select(x => x.Value) .ToList(); int available = counts.Sum(x => x.Available); + int total = counts.Sum(x => x.Total); int obtainable = counts.Sum(x => x.Obtainable); int completed = counts.Sum(x => x.Completed); - _sectionCounts[section] = new(available, obtainable, completed); + _sectionCounts[section] = new(available, total, obtainable, completed); } } @@ -368,5 +374,11 @@ internal sealed class QuestJournalComponent private sealed record FilteredGenre(JournalData.Genre Genre, List Quests); - private sealed record JournalCounts(int Available = 0, int Obtainable = 0, int Completed = 0); + private sealed record JournalCounts(int Available, int Total, int Obtainable, int Completed) + { + public JournalCounts() + : this(0, 0, 0, 0) + { + } + } } From 3cf0492990c0729e96ec5a16f7b4753bc6089751 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 22 Dec 2024 18:04:23 +0100 Subject: [PATCH 005/109] Add ARR PLD quests --- .../ComplexCombatDataExtensions.cs | 3 + .../Class Quests/PLD/1056_Honor Lost.json | 114 ++++++++ .../PLD/1057_Power Struggles.json | 75 +++++ .../PLD/1058_Poisoned Hearts.json | 259 ++++++++++++++++++ .../PLD/1059_Parley in the Sagolii.json | 72 +++++ .../PLD/1060_Keeping the Oath.json | 100 +++++++ QuestPaths/quest-v1.json | 4 + .../Questing/ComplexCombatData.cs | 1 + Questionable/Controller/CombatController.cs | 7 +- .../Controller/CombatModules/ItemUseModule.cs | 3 +- .../QuestComponents/CreationUtilsComponent.cs | 7 +- 11 files changed, 641 insertions(+), 4 deletions(-) create mode 100644 QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1056_Honor Lost.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1057_Power Struggles.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1058_Poisoned Hearts.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1059_Parley in the Sagolii.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1060_Keeping the Oath.json diff --git a/QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs b/QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs index f683890f8..05afb26cc 100644 --- a/QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs +++ b/QuestPathGenerator/RoslynElements/ComplexCombatDataExtensions.cs @@ -21,6 +21,9 @@ internal static class ComplexCombatDataExtensions Assignment(nameof(ComplexCombatData.DataId), complexCombatData.DataId, emptyData.DataId) .AsSyntaxNodeOrToken(), + Assignment(nameof(ComplexCombatData.NameId), complexCombatData.NameId, + emptyData.NameId) + .AsSyntaxNodeOrToken(), Assignment(nameof(ComplexCombatData.MinimumKillCount), complexCombatData.MinimumKillCount, emptyData.MinimumKillCount) .AsSyntaxNodeOrToken(), diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1056_Honor Lost.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1056_Honor Lost.json new file mode 100644 index 000000000..b51fe2cc9 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1056_Honor Lost.json @@ -0,0 +1,114 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "TerritoryId": 137, + "InteractionType": "EquipItem", + "ItemId": 4542, + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + }, + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -259.72705, + "Y": 67.23717, + "Z": -293.5509 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true, + "SkipConditions": { + "StepIf": { + "Flying": "Locked" + } + } + }, + { + "Position": { + "X": -355.4327, + "Y": 63.813503, + "Z": -382.56308 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "Flying": "Locked" + } + } + }, + { + "DataId": 2002346, + "Position": { + "X": -312.27594, + "Y": 32.547485, + "Z": -444.9989 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "ComplexCombatData": [ + { + "DataId": 6, + "NameId": 2020 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "NextQuestId": 1057 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1057_Power Struggles.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1057_Power Struggles.json new file mode 100644 index 000000000..2ac204b83 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1057_Power Struggles.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2002347, + "Position": { + "X": 175.82971, + "Y": -10.452454, + "Z": 84.91638 + }, + "TerritoryId": 145, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 383 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "NextQuestId": 1058 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1058_Poisoned Hearts.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1058_Poisoned Hearts.json new file mode 100644 index 000000000..c8861e537 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1058_Poisoned Hearts.json @@ -0,0 +1,259 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -97.65164, + "Y": 14.866778, + "Z": -189.99821 + }, + "StopDistance": 0.5, + "TerritoryId": 146, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 1923, + 1924 + ], + "AetheryteShortcut": "Southern Thanalan - Little Ala Mhigo", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + }, + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + } + }, + { + "DataId": 2002349, + "Position": { + "X": -97.39838, + "Y": 14.846985, + "Z": -188.2201 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -97.35628, + "Y": -14.397484, + "Z": -176.70825 + }, + "StopDistance": 0.5, + "TerritoryId": 146, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 1923, + 1924 + ], + "Fly": true, + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + } + }, + { + "DataId": 2002348, + "Position": { + "X": -99.4126, + "Y": -14.4198, + "Z": -179.46143 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "Position": { + "X": 137.78966, + "Y": 10.371678, + "Z": -427.8172 + }, + "StopDistance": 0.5, + "TerritoryId": 146, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 1923, + 1924 + ], + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + } + }, + { + "Position": { + "X": 137.78966, + "Y": 10.371678, + "Z": -427.8172 + }, + "StopDistance": 0.5, + "TerritoryId": 146, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + } + }, + { + "DataId": 2002351, + "Position": { + "X": 137.74304, + "Y": 10.60498, + "Z": -420.5539 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "Position": { + "X": 137.70113, + "Y": 10.371678, + "Z": -427.45047 + }, + "TerritoryId": 146, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "Position": { + "X": 116.208305, + "Y": 11.091853, + "Z": -475.35126 + }, + "StopDistance": 0.5, + "TerritoryId": 146, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 1923, + 1924 + ] + }, + { + "DataId": 2002350, + "Position": { + "X": 115.983765, + "Y": 11.184814, + "Z": -482.7802 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "NextQuestId": 1059 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1059_Parley in the Sagolii.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1059_Parley in the Sagolii.json new file mode 100644 index 000000000..2f013d5a9 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1059_Parley in the Sagolii.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2002356, + "Position": { + "X": -407.4312, + "Y": 7.156433, + "Z": 525.6886 + }, + "TerritoryId": 146, + "InteractionType": "SinglePlayerDuty", + "AetheryteShortcut": "Southern Thanalan - Forgotten Springs", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "NextQuestId": 1060 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1060_Keeping the Oath.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1060_Keeping the Oath.json new file mode 100644 index 000000000..e9f2519f4 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1060_Keeping the Oath.json @@ -0,0 +1,100 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1007829, + "Position": { + "X": 26.932129, + "Y": 13, + "Z": 44.418945 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Thanalan - Black Brush Station", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -775.4471, + "Y": 224.95006, + "Z": 29.04266 + }, + "StopDistance": 0.5, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead", + "Fly": true + }, + { + "Position": { + "X": -775.4471, + "Y": 224.95006, + "Z": 29.04266 + }, + "StopDistance": 0.5, + "TerritoryId": 155, + "InteractionType": "SinglePlayerDuty", + "Mount": false + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "NextQuestId": 2032 + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 359694074..7013ea2dc 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -617,6 +617,10 @@ "description": "The enemy data id which is supposed to be killed", "type": "integer" }, + "NameId": { + "description": "Name id of the enemy which is supposed to be killed, helpful if multiple nearby enemies share the same DataId", + "type": "integer" + }, "MinimumKillCount": { "description": "Overworld mobs: If this number of mobs has been killed, will wait a bit before attempting to pull another mob to see if the quest progresses", "type": "integer" diff --git a/Questionable.Model/Questing/ComplexCombatData.cs b/Questionable.Model/Questing/ComplexCombatData.cs index 5f85c2433..adc80f4a9 100644 --- a/Questionable.Model/Questing/ComplexCombatData.cs +++ b/Questionable.Model/Questing/ComplexCombatData.cs @@ -5,6 +5,7 @@ namespace Questionable.Model.Questing; public sealed class ComplexCombatData { public uint DataId { get; set; } + public uint? NameId { get; set; } // TODO Use this public uint? MinimumKillCount { get; set; } diff --git a/Questionable/Controller/CombatController.cs b/Questionable/Controller/CombatController.cs index 91eca6c14..d7ca7fde7 100644 --- a/Questionable/Controller/CombatController.cs +++ b/Questionable/Controller/CombatController.cs @@ -242,7 +242,8 @@ internal sealed class CombatController : IDisposable if (_currentFight.Data.CompletedComplexDatas.Contains(i)) continue; - if (complexCombatData[i].DataId == battleNpc.DataId) + if (complexCombatData[i].DataId == battleNpc.DataId && + (complexCombatData[i].NameId == null || complexCombatData[i].NameId == battleNpc.NameId)) return 100; } } @@ -261,7 +262,9 @@ internal sealed class CombatController : IDisposable if (gameObjectStruct->NamePlateIconId is 60093 or 60732) return 0; - var enemyData = _currentFight.Data.ComplexCombatDatas.FirstOrDefault(x => x.DataId == battleNpc.DataId); + var enemyData = _currentFight.Data.ComplexCombatDatas + .FirstOrDefault(x => x.DataId == battleNpc.DataId && + (x.NameId == null || x.NameId == battleNpc.NameId)); if (enemyData is { IgnoreQuestMarker: true }) { if (battleNpc.StatusFlags.HasFlag(StatusFlags.InCombat)) diff --git a/Questionable/Controller/CombatModules/ItemUseModule.cs b/Questionable/Controller/CombatModules/ItemUseModule.cs index 56da033fa..65f829a17 100644 --- a/Questionable/Controller/CombatModules/ItemUseModule.cs +++ b/Questionable/Controller/CombatModules/ItemUseModule.cs @@ -86,7 +86,8 @@ internal sealed class ItemUseModule : ICombatModule } if (_combatData.KillEnemyDataIds.Contains(nextTarget.DataId) || - _combatData.ComplexCombatDatas.Any(x => x.DataId == nextTarget.DataId)) + _combatData.ComplexCombatDatas.Any(x => x.DataId == nextTarget.DataId && + (x.NameId == null || (nextTarget is ICharacter character && x.NameId == character.NameId)))) { if (_isDoingRotation) { diff --git a/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs b/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs index 8fc03bb42..be6f31c19 100644 --- a/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs +++ b/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs @@ -11,6 +11,7 @@ using Dalamud.Interface.Colors; using Dalamud.Interface.Components; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; +using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Control; using FFXIVClientStructs.FFXIV.Client.Game.Event; using FFXIVClientStructs.FFXIV.Client.Game.Object; @@ -199,9 +200,13 @@ internal sealed class CreationUtilsComponent private unsafe void DrawTargetDetails(IGameObject target) { + string nameId = string.Empty; + if (target is ICharacter character) + nameId = $"; n={character.NameId}"; + ImGui.Separator(); ImGui.Text(string.Create(CultureInfo.InvariantCulture, - $"Target: {target.Name} ({target.ObjectKind}; {target.DataId})")); + $"Target: {target.Name} ({target.ObjectKind}; {target.DataId}{nameId})")); if (_clientState.LocalPlayer != null) { From d9b054e950a1c2e67b31f61f0fb07ed258fb213f Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 22 Dec 2024 18:34:36 +0100 Subject: [PATCH 006/109] Add SB PLD quests --- .../PLD/2571_Tournament of the Century.json | 171 +++++++++++++ .../Class Quests/PLD/2572_In Thal's Name.json | 99 +++++++ .../Class Quests/PLD/2573_In Nald's Name.json | 151 +++++++++++ .../PLD/2574_Fade to Black Lotus.json | 241 ++++++++++++++++++ .../PLD/2575_Raising the Sword.json | 73 ++++++ 5 files changed, 735 insertions(+) create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/PLD/2571_Tournament of the Century.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/PLD/2572_In Thal's Name.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/PLD/2573_In Nald's Name.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/PLD/2574_Fade to Black Lotus.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/PLD/2575_Raising the Sword.json diff --git a/QuestPaths/4.x - Stormblood/Class Quests/PLD/2571_Tournament of the Century.json b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2571_Tournament of the Century.json new file mode 100644 index 000000000..ad10e1a63 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2571_Tournament of the Century.json @@ -0,0 +1,171 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006747, + "Position": { + "X": -20.828613, + "Y": 29.999964, + "Z": -2.4262085 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] The Chamber of Rule" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + }, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBPLD601_02571_Q1_000_000", + "Answer": "TEXT_JOBPLD601_02571_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021342, + "Position": { + "X": -25.558899, + "Y": 38.010006, + "Z": 82.6886 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021343, + "Position": { + "X": -75.60846, + "Y": 6.9845715, + "Z": 6.210388 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] The Chamber of Rule", + "[Ul'dah] Gladiators' Guild" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1021345, + "Position": { + "X": -69.96271, + "Y": 7.0740614, + "Z": -10.696594 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1021346, + "Position": { + "X": -96.69641, + "Y": 6.9845695, + "Z": -9.506409 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 1021347, + "Position": { + "X": -105.638245, + "Y": 6.9839897, + "Z": 3.0059814 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + }, + { + "DataId": 1021344, + "Position": { + "X": -96.910095, + "Y": 6.984566, + "Z": 15.0911255 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 2572 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/PLD/2572_In Thal's Name.json b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2572_In Thal's Name.json new file mode 100644 index 000000000..da7e7c3cb --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2572_In Thal's Name.json @@ -0,0 +1,99 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gladiators' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2008101, + "Position": { + "X": -82.44458, + "Y": 1.9378662, + "Z": 60.77661 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021271, + "Position": { + "X": -87.174866, + "Y": 1.9499679, + "Z": 57.358643 + }, + "TerritoryId": 131, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 3 + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1021275, + "Position": { + "X": -84.67236, + "Y": 1.9500066, + "Z": 60.868164 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 2573 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/PLD/2573_In Nald's Name.json b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2573_In Nald's Name.json new file mode 100644 index 000000000..a89052e1c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2573_In Nald's Name.json @@ -0,0 +1,151 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gladiators' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021364, + "Position": { + "X": -84.36719, + "Y": 6.9845676, + "Z": 11.276367 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_JOBPLD650_02573_Q1_000_011", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021365, + "Position": { + "X": -94.010864, + "Y": 6.9845667, + "Z": 15.548889 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1021366, + "Position": { + "X": -99.83978, + "Y": 6.9845657, + "Z": 14.297607 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2008187, + "Position": { + "X": 22.2323, + "Y": 7.1869507, + "Z": -101.24359 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Gladiators' Guild", + "[Ul'dah] Adventurers' Guild" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Ul'dah] Adventurers' Guild", + "[Ul'dah] Gladiators' Guild" + ], + "NextQuestId": 2574 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/PLD/2574_Fade to Black Lotus.json b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2574_Fade to Black Lotus.json new file mode 100644 index 000000000..05b93b70d --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2574_Fade to Black Lotus.json @@ -0,0 +1,241 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gladiators' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021271, + "Position": { + "X": -87.174866, + "Y": 1.9499679, + "Z": 57.358643 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 64.84746, + "Y": 7.9209166, + "Z": -37.27604 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo", + "RestartNavigationIfCancelled": false, + "AethernetShortcut": [ + "[Ul'dah] Gladiators' Guild", + "[Ul'dah] Sapphire Avenue Exchange" + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1021379, + "Position": { + "X": 81.01013, + "Y": 8, + "Z": -73.624756 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1021378, + "Position": { + "X": 97.45935, + "Y": 7.9999995, + "Z": -11.947815 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1021380, + "Position": { + "X": 105.6687, + "Y": 8, + "Z": 4.714966 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1021381, + "Position": { + "X": 138.53662, + "Y": 4, + "Z": 51.377075 + }, + "TerritoryId": 131, + "InteractionType": "Say", + "ChatMessage": { + "Key": "TEXT_JOBPLD680_02574_SYSTEM_000_084" + } + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": 165.3437, + "Y": 4.014847, + "Z": 46.210514 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 141 + ] + } + } + }, + { + "DataId": 1021382, + "Position": { + "X": 282.39868, + "Y": 15.414177, + "Z": 513.1456 + }, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7237, + 7238 + ], + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBPLD680_02574_Q1_000_000", + "Answer": "TEXT_JOBPLD680_02574_A1_000_002" + } + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1021383, + "Position": { + "X": 284.71802, + "Y": 15.770843, + "Z": 512.5658 + }, + "StopDistance": 7, + "TerritoryId": 141, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gladiators' Guild" + ], + "NextQuestId": 2575 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/PLD/2575_Raising the Sword.json b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2575_Raising the Sword.json new file mode 100644 index 000000000..545573076 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/PLD/2575_Raising the Sword.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gladiators' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021271, + "Position": { + "X": -87.174866, + "Y": 1.9499679, + "Z": 57.358643 + }, + "TerritoryId": 131, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -95.62987, + "Y": 6.500003, + "Z": 41.749443 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo" + }, + { + "DataId": 1001739, + "Position": { + "X": -94.529724, + "Y": 6.5000024, + "Z": 39.81079 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From 1d6e9423bce8167d33ab15931c90a4c059f74fb2 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 22 Dec 2024 19:27:15 +0100 Subject: [PATCH 007/109] Add SB DRG quests --- .../DRG/2910_Friends through Eternity.json | 83 ++++++++ .../Class Quests/DRG/2911_Drowsy Dragons.json | 138 +++++++++++++ .../2912_Serpent and the Sea of Rubies.json | 180 ++++++++++++++++ .../DRG/2913_Dark as the Night Sky.json | 193 ++++++++++++++++++ .../Class Quests/DRG/2914_Dragon Sound.json | 59 ++++++ 5 files changed, 653 insertions(+) create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/DRG/2910_Friends through Eternity.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/DRG/2911_Drowsy Dragons.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/DRG/2912_Serpent and the Sea of Rubies.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/DRG/2913_Dark as the Night Sky.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/DRG/2914_Dragon Sound.json diff --git a/QuestPaths/4.x - Stormblood/Class Quests/DRG/2910_Friends through Eternity.json b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2910_Friends through Eternity.json new file mode 100644 index 000000000..dcd43d992 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2910_Friends through Eternity.json @@ -0,0 +1,83 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 215.65454, + "Y": 222.1, + "Z": 345.1806 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, + "$": "Alberic" + }, + { + "DataId": 1006748, + "Position": { + "X": 217.88354, + "Y": 222, + "Z": 345.3269 + }, + "TerritoryId": 155, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2008547, + "Position": { + "X": 47.592896, + "Y": -37.003174, + "Z": -297.71887 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "AetheryteShortcut": "The Dravanian Forelands - Tailfeather", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 215.65454, + "Y": 222.1, + "Z": 345.1806 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead", + "Fly": true, + "$": "Alberic" + }, + { + "DataId": 1006748, + "Position": { + "X": 217.88354, + "Y": 222, + "Z": 345.3269 + }, + "TerritoryId": 155, + "InteractionType": "CompleteQuest", + "NextQuestId": 2911 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/DRG/2911_Drowsy Dragons.json b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2911_Drowsy Dragons.json new file mode 100644 index 000000000..a6e1303be --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2911_Drowsy Dragons.json @@ -0,0 +1,138 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 215.65454, + "Y": 222.1, + "Z": 345.1806 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, + "$": "Alberic" + }, + { + "DataId": 1006748, + "Position": { + "X": 217.88354, + "Y": 222, + "Z": 345.3269 + }, + "TerritoryId": 155, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022543, + "Position": { + "X": 46.951904, + "Y": -37.000004, + "Z": -298.48175 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "AetheryteShortcut": "The Dravanian Forelands - Tailfeather", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2008548, + "Position": { + "X": 80.91858, + "Y": 68.16199, + "Z": -696.00977 + }, + "TerritoryId": 612, + "InteractionType": "Interact", + "AetheryteShortcut": "Rhalgr's Reach", + "AethernetShortcut": [ + "[Rhalgr's Reach] Aetheryte Plaza", + "[Rhalgr's Reach] Fringes Gate" + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 91.50208, + "Y": 68.1708, + "Z": -722.4152 + }, + "StopDistance": 0.5, + "TerritoryId": 612, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 8046 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1022547, + "Position": { + "X": 92.39331, + "Y": 68.1708, + "Z": -712.8557 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 215.65454, + "Y": 222.1, + "Z": 345.1806 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead", + "Fly": true, + "$": "Alberic" + }, + { + "DataId": 1006748, + "Position": { + "X": 217.88354, + "Y": 222, + "Z": 345.3269 + }, + "TerritoryId": 155, + "InteractionType": "CompleteQuest", + "NextQuestId": 2912 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/DRG/2912_Serpent and the Sea of Rubies.json b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2912_Serpent and the Sea of Rubies.json new file mode 100644 index 000000000..879162c1f --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2912_Serpent and the Sea of Rubies.json @@ -0,0 +1,180 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 215.65454, + "Y": 222.1, + "Z": 345.1806 + }, + "TerritoryId": 155, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, + "$": "Alberic" + }, + { + "DataId": 1006748, + "Position": { + "X": 217.88354, + "Y": 222, + "Z": 345.3269 + }, + "TerritoryId": 155, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1018982, + "Position": { + "X": -83.08539, + "Y": 18.05, + "Z": -191.14978 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Bokairo Inn" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022550, + "Position": { + "X": -728.9082, + "Y": 0.34026724, + "Z": -427.9698 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1022551, + "Position": { + "X": -772.549, + "Y": 4.7634416, + "Z": -504.29544 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2008550, + "Position": { + "X": -711.20776, + "Y": 0.44250488, + "Z": -545.4337 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": 657.20935, + "Y": 1.1933115, + "Z": -799.82635 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Ruby Sea - Onokoro", + "Fly": true + }, + { + "DataId": 1022552, + "Position": { + "X": 657.7401, + "Y": 1.0385457, + "Z": -797.8485 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7488 + ] + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1022552, + "Position": { + "X": 657.7401, + "Y": 1.0385457, + "Z": -797.8485 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1022553, + "Position": { + "X": -92.607056, + "Y": 18.9999, + "Z": -194.41522 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Bokairo Inn" + ], + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBDRG650_02912_Q1_000_000", + "Answer": "TEXT_JOBDRG650_02912_A1_000_001" + } + ], + "NextQuestId": 2913 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/DRG/2913_Dark as the Night Sky.json b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2913_Dark as the Night Sky.json new file mode 100644 index 000000000..30db4f697 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2913_Dark as the Night Sky.json @@ -0,0 +1,193 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1022553, + "Position": { + "X": -92.607056, + "Y": 18.9999, + "Z": -194.41522 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Bokairo Inn" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022748, + "Position": { + "X": 13.046387, + "Y": -7.961876, + "Z": -99.77875 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Bokairo Inn", + "[Kugane] Rakuza District" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022560, + "Position": { + "X": 528.4656, + "Y": -19.450546, + "Z": 273.33484 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "AetheryteShortcut": "Azim Steppe - Reunion", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1022554, + "Position": { + "X": 554.9553, + "Y": -19.411264, + "Z": 274.92175 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1022555, + "Position": { + "X": 545.4337, + "Y": -19.505648, + "Z": 309.68176 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1022556, + "Position": { + "X": 570.3364, + "Y": -19.50564, + "Z": 319.11182 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1022560, + "Position": { + "X": 528.4656, + "Y": -19.450546, + "Z": 273.33484 + }, + "TerritoryId": 622, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1022561, + "Position": { + "X": -288.4718, + "Y": 60.053967, + "Z": -328.1148 + }, + "TerritoryId": 622, + "InteractionType": "SinglePlayerDuty", + "Fly": true + } + ] + }, + { + "Sequence": 6 + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1022569, + "Position": { + "X": -309.5293, + "Y": 61.288292, + "Z": -319.50867 + }, + "TerritoryId": 622, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1022560, + "Position": { + "X": 528.4656, + "Y": -19.450546, + "Z": 273.33484 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Azim Steppe - Reunion", + "Fly": true, + "NextQuestId": 2914 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/DRG/2914_Dragon Sound.json b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2914_Dragon Sound.json new file mode 100644 index 000000000..3561d3c05 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/DRG/2914_Dragon Sound.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1022560, + "Position": { + "X": 528.4656, + "Y": -19.450546, + "Z": 273.33484 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Azim Steppe - Reunion", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022562, + "Position": { + "X": -494.3466, + "Y": 71.278076, + "Z": -509.51404 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1022562, + "Position": { + "X": -494.3466, + "Y": 71.278076, + "Z": -509.51404 + }, + "StopDistance": 7, + "TerritoryId": 622, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From 3d16879980f12eec77a7e7487c5294f13e61f5b7 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 22 Dec 2024 19:28:14 +0100 Subject: [PATCH 008/109] Add unlock conditions to 'A Hero's Journey' --- Questionable/Data/QuestData.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index b875d700d..7e07f2f92 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -182,6 +182,14 @@ internal sealed class QuestData AddPreviousQuest(new QuestId(3833), new QuestId(spearfishing)); */ + // The Hero's Journey + AddPreviousQuest(new QuestId(3986), new QuestId(2115)); + AddPreviousQuest(new QuestId(3986), new QuestId(2116)); + AddPreviousQuest(new QuestId(3986), new QuestId(2281)); + AddPreviousQuest(new QuestId(3986), new QuestId(2333)); + AddPreviousQuest(new QuestId(3986), new QuestId(2395)); + AddPreviousQuest(new QuestId(3986), new QuestId(3985)); + // initial city quests are side quests // unclear if 470 can be started as the required quest isn't available anymore ushort[] limsaSideQuests = From 55b62be3b8defbb7a3afffe0f12a8e7022566615 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 22 Dec 2024 20:36:52 +0100 Subject: [PATCH 009/109] Add HW BLM quests --- .../BLM/1078_Always Bet on Black.json | 3 +- .../Class Quests/BLM/1678_Black Books.json | 100 +++++++++ .../BLM/1679_An Unexpected Journey.json | 111 ++++++++++ .../Class Quests/BLM/1680_A Cunning Plan.json | 122 +++++++++++ .../BLM/1681_Black Squawk Down.json | 98 +++++++++ ...82_Destruction in the Name of Justice.json | 194 ++++++++++++++++++ .../BLM/1683_The Defiant Ones.json | 160 +++++++++++++++ 7 files changed, 787 insertions(+), 1 deletion(-) create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/BLM/1678_Black Books.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/BLM/1679_An Unexpected Journey.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/BLM/1680_A Cunning Plan.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/BLM/1681_Black Squawk Down.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/BLM/1682_Destruction in the Name of Justice.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/BLM/1683_The Defiant Ones.json diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/BLM/1078_Always Bet on Black.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/BLM/1078_Always Bet on Black.json index a24c97b80..b8a3faba7 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/BLM/1078_Always Bet on Black.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/BLM/1078_Always Bet on Black.json @@ -201,7 +201,8 @@ "AetheryteShortcutIf": { "InSameTerritory": true } - } + }, + "NextQuestId": 1678 } ] } diff --git a/QuestPaths/3.x - Heavensward/Class Quests/BLM/1678_Black Books.json b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1678_Black Books.json new file mode 100644 index 000000000..d66e1c0dd --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1678_Black Books.json @@ -0,0 +1,100 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1004597, + "Position": { + "X": -292.10345, + "Y": -2.910112, + "Z": 245.59387 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "AetheryteShortcut": "Southern Thanalan - Forgotten Springs", + "Fly": true, + "TargetTerritoryId": 146 + }, + { + "DataId": 1013042, + "Position": { + "X": -465.93427, + "Y": -3.164927, + "Z": 66.666626 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1013043, + "Position": { + "X": 184.6189, + "Y": 3.1809216, + "Z": -334.27942 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 1679 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/BLM/1679_An Unexpected Journey.json b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1679_An Unexpected Journey.json new file mode 100644 index 000000000..e0fcaf33c --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1679_An Unexpected Journey.json @@ -0,0 +1,111 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006753, + "Position": { + "X": 325.063, + "Y": 11.236564, + "Z": -6.2105103 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1013044, + "Position": { + "X": 191.72961, + "Y": -1.9153122, + "Z": 32.944214 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBBLM520_01679_Q1_000_000", + "Answer": "TEXT_JOBBLM520_01679_A1_000_002" + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1006753, + "Position": { + "X": 325.063, + "Y": 11.236564, + "Z": -6.2105103 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 1680 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/BLM/1680_A Cunning Plan.json b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1680_A Cunning Plan.json new file mode 100644 index 000000000..0f39034c5 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1680_A Cunning Plan.json @@ -0,0 +1,122 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1013047, + "Position": { + "X": 409.4757, + "Y": -3.3999999, + "Z": 198.99292 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2005469, + "Position": { + "X": 377.6454, + "Y": 0.77819824, + "Z": -3.616455 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 397.41708, + "Y": -3.3999999, + "Z": 10.57353 + }, + "StopDistance": 0.5, + "TerritoryId": 139, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 5049 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1013048, + "Position": { + "X": 399.0996, + "Y": -3.3999999, + "Z": 11.215393 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 1681 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/BLM/1681_Black Squawk Down.json b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1681_Black Squawk Down.json new file mode 100644 index 000000000..8aeb33501 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1681_Black Squawk Down.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -173.73607, + "Y": -61.73199, + "Z": 370.57892 + }, + "StopDistance": 0.5, + "TerritoryId": 154, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 4360 + ], + "AetheryteShortcut": "North Shroud - Fallgourd Float", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1013055, + "Position": { + "X": -175.1278, + "Y": -61.86741, + "Z": 371.99963 + }, + "TerritoryId": 154, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBBLM560_01681_Q1_000_000", + "Answer": "TEXT_JOBBLM560_01681_A1_000_001" + } + ], + "NextQuestId": 1682 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/BLM/1682_Destruction in the Name of Justice.json b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1682_Destruction in the Name of Justice.json new file mode 100644 index 000000000..94a7616e8 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1682_Destruction in the Name of Justice.json @@ -0,0 +1,194 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1013059, + "Position": { + "X": 30.411133, + "Y": 7.1999984, + "Z": -103.07471 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Adventurers' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1013060, + "Position": { + "X": 26.04712, + "Y": 1.2752796, + "Z": 92.851074 + }, + "TerritoryId": 418, + "InteractionType": "Interact", + "AetheryteShortcut": "Ishgard", + "AethernetShortcut": [ + "[Ishgard] Aetheryte Plaza", + "[Ishgard] The Brume" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1013061, + "Position": { + "X": -277.69897, + "Y": 124.9653, + "Z": -19.394226 + }, + "StopDistance": 1.5, + "TerritoryId": 397, + "InteractionType": "Interact", + "AetheryteShortcut": "Coerthas Western Highlands - Falcon's Nest", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1013064, + "Position": { + "X": -308.33905, + "Y": 126.09976, + "Z": -14.847046 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1013062, + "Position": { + "X": -301.99133, + "Y": 126.85933, + "Z": 4.8981323 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1013063, + "Position": { + "X": -284.44348, + "Y": 127.18384, + "Z": 11.825684 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1013065, + "Position": { + "X": -67.00244, + "Y": 98.04463, + "Z": 189.99011 + }, + "TerritoryId": 397, + "InteractionType": "SinglePlayerDuty", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBBLM580_01682_Q1_000_000", + "Answer": "TEXT_JOBBLM580_01682_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 1683 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/BLM/1683_The Defiant Ones.json b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1683_The Defiant Ones.json new file mode 100644 index 000000000..b8ca65676 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/BLM/1683_The Defiant Ones.json @@ -0,0 +1,160 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1013066, + "Position": { + "X": 385.27502, + "Y": -18.74231, + "Z": 273.0907 + }, + "TerritoryId": 145, + "InteractionType": "SinglePlayerDuty", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "Fly": true + } + ] + }, + { + "Sequence": 2 + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1013187, + "Position": { + "X": 476.73767, + "Y": -64.30186, + "Z": 234.2107 + }, + "StopDistance": 5, + "TerritoryId": 145, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 341.93842, + "Y": 28.63408, + "Z": 66.419495 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1013189, + "Position": { + "X": 322.89612, + "Y": 10.818874, + "Z": -8.46875 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1006753, + "Position": { + "X": 325.063, + "Y": 11.236564, + "Z": -6.2105103 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1013188, + "Position": { + "X": 327.96216, + "Y": 11.425721, + "Z": -6.7597656 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 2588 + } + ] + } + ] +} From 118a5948a522b926ed74cc09c7748260ad7dc066 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 22 Dec 2024 21:26:29 +0100 Subject: [PATCH 010/109] Add config option to switch between VBM/RSR --- Questionable/Configuration.cs | 12 +- .../Controller/CombatModules/BossModModule.cs | 38 +++-- .../RotationSolverRebornModule.cs | 7 +- Questionable/Windows/ConfigWindow.cs | 9 ++ Questionable/Windows/OneTimeSetupWindow.cs | 132 +++++++++++++----- Questionable/Windows/QuestWindow.cs | 19 ++- Questionable/Windows/UiUtils.cs | 3 +- 7 files changed, 172 insertions(+), 48 deletions(-) diff --git a/Questionable/Configuration.cs b/Questionable/Configuration.cs index 29358b34e..ce4c96165 100644 --- a/Questionable/Configuration.cs +++ b/Questionable/Configuration.cs @@ -7,9 +7,9 @@ namespace Questionable; internal sealed class Configuration : IPluginConfiguration { - public const int PluginSetupVersion = 2; + public const int PluginSetupVersion = 3; - public int Version { get; set; } =1 ; + public int Version { get; set; } = 1; public int PluginSetupCompleteVersion { get; set; } public GeneralConfiguration General { get; } = new(); public NotificationConfiguration Notifications { get; } = new(); @@ -23,6 +23,7 @@ internal sealed class Configuration : IPluginConfiguration internal sealed class GeneralConfiguration { + public ECombatModule CombatModule { get; set; } = ECombatModule.BossMod; public uint MountId { get; set; } = 71; public GrandCompany GrandCompany { get; set; } = GrandCompany.None; public bool HideInAllInstances { get; set; } = true; @@ -45,4 +46,11 @@ internal sealed class Configuration : IPluginConfiguration public bool NeverFly { get; set; } public bool AdditionalStatusInformation { get; set; } } + + internal enum ECombatModule + { + None, + BossMod, + RotationSolverReborn, + } } diff --git a/Questionable/Controller/CombatModules/BossModModule.cs b/Questionable/Controller/CombatModules/BossModModule.cs index a26d1c745..f27a6f810 100644 --- a/Questionable/Controller/CombatModules/BossModModule.cs +++ b/Questionable/Controller/CombatModules/BossModModule.cs @@ -12,22 +12,44 @@ using System.Numerics; namespace Questionable.Controller.CombatModules; -internal sealed class BossModModule(ILogger logger, MovementController movementController, IClientState clientState, IDalamudPluginInterface pluginInterface) : ICombatModule, IDisposable +internal sealed class BossModModule : ICombatModule, IDisposable { private const string Name = "BossMod"; - private readonly ILogger _logger = logger; - private readonly MovementController _movementController = movementController; - private readonly IClientState _clientState = clientState; - private readonly ICallGateSubscriber _getPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.Get"); - private readonly ICallGateSubscriber _createPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.Create"); - private readonly ICallGateSubscriber _setPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.SetActive"); - private readonly ICallGateSubscriber _clearPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.ClearActive"); + private readonly ILogger _logger; + private readonly MovementController _movementController; + private readonly IClientState _clientState; + private readonly Configuration _configuration; + private readonly ICallGateSubscriber _getPreset; + private readonly ICallGateSubscriber _createPreset; + private readonly ICallGateSubscriber _setPreset; + private readonly ICallGateSubscriber _clearPreset; private static Stream Preset => typeof(BossModModule).Assembly.GetManifestResourceStream("Questionable.Controller.CombatModules.BossModPreset")!; private DateTime _lastDistanceCheck = DateTime.MinValue; + public BossModModule( + ILogger logger, + MovementController movementController, + IClientState clientState, + IDalamudPluginInterface pluginInterface, + Configuration configuration) + { + _logger = logger; + _movementController = movementController; + _clientState = clientState; + _configuration = configuration; + + _getPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.Get"); + _createPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.Create"); + _setPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.SetActive"); + _clearPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.ClearActive"); + } + public bool CanHandleFight(CombatController.CombatData combatData) { + if (_configuration.General.CombatModule != Configuration.ECombatModule.BossMod) + return false; + try { return _getPreset.HasFunction; diff --git a/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs b/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs index 581e07a96..d5f13f4ef 100644 --- a/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs +++ b/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs @@ -16,17 +16,19 @@ internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable private readonly ILogger _logger; private readonly MovementController _movementController; private readonly IClientState _clientState; + private readonly Configuration _configuration; private readonly ICallGateSubscriber _test; private readonly ICallGateSubscriber _changeOperationMode; private DateTime _lastDistanceCheck = DateTime.MinValue; public RotationSolverRebornModule(ILogger logger, MovementController movementController, - IClientState clientState, IDalamudPluginInterface pluginInterface) + IClientState clientState, IDalamudPluginInterface pluginInterface, Configuration configuration) { _logger = logger; _movementController = movementController; _clientState = clientState; + _configuration = configuration; _test = pluginInterface.GetIpcSubscriber("RotationSolverReborn.Test"); _changeOperationMode = pluginInterface.GetIpcSubscriber("RotationSolverReborn.ChangeOperatingMode"); @@ -34,6 +36,9 @@ internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable public bool CanHandleFight(CombatController.CombatData combatData) { + if (_configuration.General.CombatModule != Configuration.ECombatModule.RotationSolverReborn) + return false; + try { _test.InvokeAction("Validate RSR is callable from Questionable"); diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs index 27c968a0f..7cd19627f 100644 --- a/Questionable/Windows/ConfigWindow.cs +++ b/Questionable/Windows/ConfigWindow.cs @@ -26,6 +26,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig private readonly uint[] _mountIds; private readonly string[] _mountNames; + private readonly string[] _combatModuleNames = ["None", "Boss Mod (VBM)", "Rotation Solver Reborn"]; private readonly string[] _grandCompanyNames = ["None (manually pick quest)", "Maelstrom", "Twin Adder", "Immortal Flames"]; @@ -65,6 +66,14 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig using var tab = ImRaii.TabItem("General"); if (!tab) return; + + int selectedCombatModule = (int)_configuration.General.CombatModule; + if (ImGui.Combo("Preferred Combat Module", ref selectedCombatModule, _combatModuleNames, _combatModuleNames.Length)) + { + _configuration.General.CombatModule = (Configuration.ECombatModule)selectedCombatModule; + Save(); + } + int selectedMount = Array.FindIndex(_mountIds, x => x == _configuration.General.MountId); if (selectedMount == -1) { diff --git a/Questionable/Windows/OneTimeSetupWindow.cs b/Questionable/Windows/OneTimeSetupWindow.cs index b94b3fc80..3ba35a096 100644 --- a/Questionable/Windows/OneTimeSetupWindow.cs +++ b/Questionable/Windows/OneTimeSetupWindow.cs @@ -44,6 +44,27 @@ internal sealed class OneTimeSetupWindow : LWindow new Uri("https://github.com/NightmareXIV/MyDalamudPlugins/raw/main/pluginmaster.json")), ]; + private static readonly IReadOnlyDictionary CombatPlugins = new Dictionary + { + { + Configuration.ECombatModule.BossMod, + new("Boss Mod (VBM)", + "BossMod", + string.Empty, + new Uri("https://github.com/awgil/ffxiv_bossmod"), + new Uri("https://puni.sh/api/repository/veyn")) + }, + { + Configuration.ECombatModule.RotationSolverReborn, + new("Rotation Solver Reborn", + "RotationSolver", + string.Empty, + new Uri("https://github.com/FFXIV-CombatReborn/RotationSolverReborn"), + new Uri( + "https://raw.githubusercontent.com/FFXIV-CombatReborn/CombatRebornRepo/main/pluginmaster.json")) + }, + }.AsReadOnly(); + private readonly IReadOnlyList _recommendedPlugins; private readonly Configuration _configuration; @@ -60,18 +81,8 @@ internal sealed class OneTimeSetupWindow : LWindow _pluginInterface = pluginInterface; _uiUtils = uiUtils; _logger = logger; - _recommendedPlugins = [ - new("Rotation Solver Reborn", - "RotationSolver", - """ - Automatically handles most combat interactions you encounter - during quests, including being interrupted by mobs. - """, - new Uri("https://github.com/FFXIV-CombatReborn/RotationSolverReborn"), - new Uri( - "https://raw.githubusercontent.com/FFXIV-CombatReborn/CombatRebornRepo/main/pluginmaster.json")), new PluginInfo("CBT (formerly known as Automaton)", "Automaton", """ @@ -120,6 +131,25 @@ internal sealed class OneTimeSetupWindow : LWindow ImGui.Separator(); ImGui.Spacing(); + ImGui.Text("Questionable supports multiple rotation/combat plugins, please pick the one\nyou want to use:"); + + using (ImRaii.PushIndent()) + { + if (ImGui.RadioButton("No rotation/combat plugin (combat must be done manually)", + _configuration.General.CombatModule == Configuration.ECombatModule.None)) + { + _configuration.General.CombatModule = Configuration.ECombatModule.None; + _pluginInterface.SavePluginConfig(_configuration); + } + + DrawCombatPlugin(Configuration.ECombatModule.BossMod, checklistPadding); + DrawCombatPlugin(Configuration.ECombatModule.RotationSolverReborn, checklistPadding); + } + + ImGui.Spacing(); + ImGui.Separator(); + ImGui.Spacing(); + ImGui.Text("The following plugins are recommended, but not required:"); using (ImRaii.PushIndent()) { @@ -164,39 +194,75 @@ internal sealed class OneTimeSetupWindow : LWindow private bool DrawPlugin(PluginInfo plugin, float checklistPadding) { - bool isInstalled = IsPluginInstalled(plugin); using (ImRaii.PushId("plugin_" + plugin.DisplayName)) { + bool isInstalled = IsPluginInstalled(plugin); _uiUtils.ChecklistItem(plugin.DisplayName, isInstalled); - using (ImRaii.PushIndent(checklistPadding)) + + DrawPluginDetails(plugin, checklistPadding, isInstalled); + return isInstalled; + } + } + + private void DrawCombatPlugin(Configuration.ECombatModule combatModule, float checklistPadding) + { + ImGui.Spacing(); + + PluginInfo plugin = CombatPlugins[combatModule]; + using (ImRaii.PushId("plugin_" + plugin.DisplayName)) + { + bool isInstalled = IsPluginInstalled(plugin); + if (ImGui.RadioButton(plugin.DisplayName, _configuration.General.CombatModule == combatModule)) { + _configuration.General.CombatModule = combatModule; + _pluginInterface.SavePluginConfig(_configuration); + } + + ImGui.SameLine(0); + using (_pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) + { + var iconColor = isInstalled ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed; + var icon = isInstalled ? FontAwesomeIcon.Check : FontAwesomeIcon.Times; + + ImGui.AlignTextToFramePadding(); + ImGui.TextColored(iconColor, icon.ToIconString()); + } + + + DrawPluginDetails(plugin, checklistPadding, isInstalled); + } + } + + private void DrawPluginDetails(PluginInfo plugin, float checklistPadding, bool isInstalled) + { + using (ImRaii.PushIndent(checklistPadding)) + { + if (!string.IsNullOrEmpty(plugin.Details)) ImGui.TextUnformatted(plugin.Details); - if (plugin.DetailsToCheck != null) - { - foreach (var detail in plugin.DetailsToCheck) - _uiUtils.ChecklistItem(detail.DisplayName, isInstalled && detail.Predicate()); - } - ImGui.Spacing(); + if (plugin.DetailsToCheck != null) + { + foreach (var detail in plugin.DetailsToCheck) + _uiUtils.ChecklistItem(detail.DisplayName, isInstalled && detail.Predicate()); + } - if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Globe, "Open Website")) - Util.OpenLink(plugin.WebsiteUri.ToString()); + ImGui.Spacing(); - ImGui.SameLine(); - if (plugin.DalamudRepositoryUri != null) - { - if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Code, "Open Repository")) - Util.OpenLink(plugin.DalamudRepositoryUri.ToString()); - } - else - { - ImGui.AlignTextToFramePadding(); - ImGuiComponents.HelpMarker("Available on official Dalamud Repository"); - } + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Globe, "Open Website")) + Util.OpenLink(plugin.WebsiteUri.ToString()); + + ImGui.SameLine(); + if (plugin.DalamudRepositoryUri != null) + { + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Code, "Open Repository")) + Util.OpenLink(plugin.DalamudRepositoryUri.ToString()); + } + else + { + ImGui.AlignTextToFramePadding(); + ImGuiComponents.HelpMarker("Available on official Dalamud Repository"); } } - - return isInstalled; } private bool IsPluginInstalled(PluginInfo pluginInfo) diff --git a/Questionable/Windows/QuestWindow.cs b/Questionable/Windows/QuestWindow.cs index 4c100a1ba..2bcdbf9d2 100644 --- a/Questionable/Windows/QuestWindow.cs +++ b/Questionable/Windows/QuestWindow.cs @@ -44,7 +44,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig QuickAccessButtonsComponent quickAccessButtonsComponent, RemainingTasksComponent remainingTasksComponent, IFramework framework, - InteractionUiController interactionUiController) + InteractionUiController interactionUiController, + ConfigWindow configWindow) : base($"Questionable v{PluginVersion.ToString(2)}###Questionable", ImGuiWindowFlags.AlwaysAutoResize) { @@ -67,7 +68,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig #endif SizeConstraints = new WindowSizeConstraints { - MinimumSize = new Vector2(230, 30), + MinimumSize = new Vector2(240, 30), MaximumSize = default }; RespectCloseHotkey = false; @@ -87,6 +88,20 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig }; TitleBarButtons.Insert(0, _minimizeButton); + TitleBarButtons.Add(new TitleBarButton + { + Icon = FontAwesomeIcon.Cog, + IconOffset = new Vector2(1.5f, 1), + Click = _ => configWindow.IsOpen = true, + Priority = int.MinValue, + ShowTooltip = () => + { + ImGui.BeginTooltip(); + ImGui.Text("Open Configuration"); + ImGui.EndTooltip(); + } + }); + _activeQuestComponent.Reload += OnReload; _quickAccessButtonsComponent.Reload += OnReload; } diff --git a/Questionable/Windows/UiUtils.cs b/Questionable/Windows/UiUtils.cs index 9c51f253f..b03fabfe0 100644 --- a/Questionable/Windows/UiUtils.cs +++ b/Questionable/Windows/UiUtils.cs @@ -55,8 +55,7 @@ internal sealed class UiUtils public bool ChecklistItem(string text, Vector4 color, FontAwesomeIcon icon, float extraPadding = 0) { - // ReSharper disable once UnusedVariable - using (var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) + using (_pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) { ImGui.TextColored(color, icon.ToIconString()); } From f7306166def704c202dd110b6509b7623799192d Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 25 Dec 2024 01:26:45 +0100 Subject: [PATCH 011/109] Add SB BLM quests --- .../BLM/2588_Shades of Shatotto.json | 83 +++++++++ .../BLM/2589_Golems Gone Wild.json | 163 ++++++++++++++++++ .../BLM/2590_When the Golems Get Tough.json | 155 +++++++++++++++++ .../BLM/2591_Unnatural Selection.json | 143 +++++++++++++++ .../BLM/2592_One Golem to Rule Them All.json | 118 +++++++++++++ QuestPaths/quest-v1.json | 3 +- .../Questing/Converter/ActionConverter.cs | 1 + Questionable.Model/Questing/EAction.cs | 1 + 8 files changed, 666 insertions(+), 1 deletion(-) create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLM/2588_Shades of Shatotto.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLM/2589_Golems Gone Wild.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLM/2590_When the Golems Get Tough.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLM/2591_Unnatural Selection.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLM/2588_Shades of Shatotto.json b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2588_Shades of Shatotto.json new file mode 100644 index 000000000..fe3c501f7 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2588_Shades of Shatotto.json @@ -0,0 +1,83 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1004597, + "Position": { + "X": -292.10345, + "Y": -2.910112, + "Z": 245.59387 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "AetheryteShortcut": "Southern Thanalan - Forgotten Springs", + "Fly": true, + "TargetTerritoryId": 146 + }, + { + "DataId": 1020959, + "Position": { + "X": -463.1571, + "Y": -3.164927, + "Z": 61.264893 + }, + "TerritoryId": 146, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 2589 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLM/2589_Golems Gone Wild.json b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2589_Golems Gone Wild.json new file mode 100644 index 000000000..28892d1c5 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2589_Golems Gone Wild.json @@ -0,0 +1,163 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1008543, + "Position": { + "X": -360.00616, + "Y": 1.2644191, + "Z": 459.83057 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007872, + "Position": { + "X": -275.62378, + "Y": 4.8675537, + "Z": 523.76587 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AfterAction", + "Action": "Fire III", + "KillEnemyDataIds": [ + 7232 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2007873, + "Position": { + "X": -298.909, + "Y": 11.825684, + "Z": 567.46765 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AfterAction", + "Action": "Fire III", + "KillEnemyDataIds": [ + 7232 + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2007874, + "Position": { + "X": -310.5974, + "Y": 12.344482, + "Z": 645.777 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AfterAction", + "Action": "Fire III", + "KillEnemyDataIds": [ + 7232 + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1020964, + "Position": { + "X": -348.50085, + "Y": 0.22347936, + "Z": 454.45935 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1020966, + "Position": { + "X": 87.47986, + "Y": 18, + "Z": 113.69495 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 2590 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLM/2590_When the Golems Get Tough.json b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2590_When the Golems Get Tough.json new file mode 100644 index 000000000..a090c4fef --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2590_When the Golems Get Tough.json @@ -0,0 +1,155 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021051, + "Position": { + "X": -36.91156, + "Y": 20.090933, + "Z": -679.07227 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "AetheryteShortcut": "Mor Dhona" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -335.20407, + "Y": -15.94506, + "Z": -491.67297 + }, + "TerritoryId": 156, + "InteractionType": "WalkTo", + "Fly": true, + "$": "Pathfinding workaround" + }, + { + "DataId": 1021052, + "Position": { + "X": -334.00476, + "Y": -16.18119, + "Z": -490.1961 + }, + "TerritoryId": 156, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007907, + "Position": { + "X": -321.21765, + "Y": -16.922302, + "Z": -361.6236 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -412.69736, + "Y": -17.148405, + "Z": -361.9313 + }, + "StopDistance": 0.5, + "TerritoryId": 156, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7233 + ], + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1021059, + "Position": { + "X": -413.80945, + "Y": -17.148407, + "Z": -362.23395 + }, + "TerritoryId": 156, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBBLM650_02590_Q2_000_000", + "Answer": "TEXT_JOBBLM650_02590_A2_000_001" + } + ], + "NextQuestId": 2591 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLM/2591_Unnatural Selection.json b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2591_Unnatural Selection.json new file mode 100644 index 000000000..f60a18597 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2591_Unnatural Selection.json @@ -0,0 +1,143 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021086, + "Position": { + "X": 326.10046, + "Y": 11.181234, + "Z": -8.743469 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021090, + "Position": { + "X": 7.2174683, + "Y": 115.514336, + "Z": -720.7599 + }, + "StopDistance": 0.5, + "TerritoryId": 620, + "InteractionType": "Interact", + "AetheryteShortcut": "Peaks - Ala Gannha", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007936, + "Position": { + "X": -284.93176, + "Y": 66.20886, + "Z": -679.07227 + }, + "TerritoryId": 620, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7234 + ], + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1021092, + "Position": { + "X": -266.4073, + "Y": 76.297005, + "Z": -623.1022 + }, + "TerritoryId": 620, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1006753, + "Position": { + "X": 325.063, + "Y": 11.236564, + "Z": -6.2105103 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 2592 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json new file mode 100644 index 000000000..a5b89ff5e --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json @@ -0,0 +1,118 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021097, + "Position": { + "X": -270.37463, + "Y": -29.998833, + "Z": 111.92493 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "AetheryteShortcut": "The Dravanian Forelands - Anyx Trine", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1011935, + "Position": { + "X": -285.63367, + "Y": 39.04305, + "Z": 53.72693 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1021102, + "Position": { + "X": -287.19012, + "Y": 39.04307, + "Z": 44.47998 + }, + "TerritoryId": 398, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1021104, + "Position": { + "X": -267.17023, + "Y": -30.09441, + "Z": 117.54016 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006752, + "Position": { + "X": 87.5105, + "Y": 18, + "Z": 113.725464 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ] + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 7013ea2dc..718b36caf 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -978,7 +978,8 @@ "Hide", "Slug Shot", "Bosom Brook", - "Souleater" + "Souleater", + "Fire III" ] } }, diff --git a/Questionable.Model/Questing/Converter/ActionConverter.cs b/Questionable.Model/Questing/Converter/ActionConverter.cs index 141e4f2ef..8d211442f 100644 --- a/Questionable.Model/Questing/Converter/ActionConverter.cs +++ b/Questionable.Model/Questing/Converter/ActionConverter.cs @@ -44,5 +44,6 @@ public sealed class ActionConverter() : EnumConverter(Values) { EAction.SlugShot, "Slug Shot" }, { EAction.BosomBrook, "Bosom Brook" }, { EAction.Souleater, "Souleater" }, + { EAction.Fire3, "Fire III" }, }; } diff --git a/Questionable.Model/Questing/EAction.cs b/Questionable.Model/Questing/EAction.cs index 1b23da040..ed4d6e83e 100644 --- a/Questionable.Model/Questing/EAction.cs +++ b/Questionable.Model/Questing/EAction.cs @@ -50,6 +50,7 @@ public enum EAction SlugShot = 7412, BosomBrook = 37173, Souleater = 3632, + Fire3 = 152, CollectMiner = 240, ScourMiner = 22182, From 7503aa92804174e2ef984c0cd26b59fcf1533809 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 25 Dec 2024 01:32:27 +0100 Subject: [PATCH 012/109] Don't allow changing combat module while in combat --- .../BLM/2592_One Golem to Rule Them All.json | 3 ++ Questionable/Windows/ConfigWindow.cs | 30 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json index a5b89ff5e..c2ba041e9 100644 --- a/QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLM/2592_One Golem to Rule Them All.json @@ -78,6 +78,9 @@ } ] }, + { + "Sequence": 4 + }, { "Sequence": 5, "Steps": [ diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs index 7cd19627f..5184761c5 100644 --- a/Questionable/Windows/ConfigWindow.cs +++ b/Questionable/Windows/ConfigWindow.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Linq; using Dalamud.Game.Text; using Dalamud.Interface.Colors; @@ -12,6 +11,7 @@ using Dalamud.Utility; using ImGuiNET; using LLib.ImGui; using Lumina.Excel.Sheets; +using Questionable.Controller; using Questionable.External; using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; @@ -19,24 +19,32 @@ namespace Questionable.Windows; internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig { + private static readonly List<(uint Id, string Name)> DefaultMounts = [(0, "Mount Roulette")]; + private readonly IDalamudPluginInterface _pluginInterface; private readonly NotificationMasterIpc _notificationMasterIpc; private readonly Configuration _configuration; + private readonly CombatController _combatController; private readonly uint[] _mountIds; private readonly string[] _mountNames; private readonly string[] _combatModuleNames = ["None", "Boss Mod (VBM)", "Rotation Solver Reborn"]; + private readonly string[] _grandCompanyNames = ["None (manually pick quest)", "Maelstrom", "Twin Adder", "Immortal Flames"]; - [SuppressMessage("Performance", "CA1861", Justification = "One time initialization")] - public ConfigWindow(IDalamudPluginInterface pluginInterface, NotificationMasterIpc notificationMasterIpc, Configuration configuration, IDataManager dataManager) + public ConfigWindow(IDalamudPluginInterface pluginInterface, + NotificationMasterIpc notificationMasterIpc, + Configuration configuration, + IDataManager dataManager, + CombatController combatController) : base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize) { _pluginInterface = pluginInterface; _notificationMasterIpc = notificationMasterIpc; _configuration = configuration; + _combatController = combatController; var mounts = dataManager.GetExcelSheet() .Where(x => x is { RowId: > 0, Icon: > 0 }) @@ -44,8 +52,8 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig .Where(x => !string.IsNullOrEmpty(x.Name)) .OrderBy(x => x.Name) .ToList(); - _mountIds = new uint[] { 0 }.Concat(mounts.Select(x => x.MountId)).ToArray(); - _mountNames = new[] { "Mount Roulette" }.Concat(mounts.Select(x => x.Name)).ToArray(); + _mountIds = DefaultMounts.Select(x => x.Id).Concat(mounts.Select(x => x.MountId)).ToArray(); + _mountNames = DefaultMounts.Select(x => x.Name).Concat(mounts.Select(x => x.Name)).ToArray(); } public WindowConfig WindowConfig => _configuration.ConfigWindowConfig; @@ -67,11 +75,15 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig if (!tab) return; - int selectedCombatModule = (int)_configuration.General.CombatModule; - if (ImGui.Combo("Preferred Combat Module", ref selectedCombatModule, _combatModuleNames, _combatModuleNames.Length)) + using (ImRaii.Disabled(_combatController.IsRunning)) { - _configuration.General.CombatModule = (Configuration.ECombatModule)selectedCombatModule; - Save(); + int selectedCombatModule = (int)_configuration.General.CombatModule; + if (ImGui.Combo("Preferred Combat Module", ref selectedCombatModule, _combatModuleNames, + _combatModuleNames.Length)) + { + _configuration.General.CombatModule = (Configuration.ECombatModule)selectedCombatModule; + Save(); + } } int selectedMount = Array.FindIndex(_mountIds, x => x == _configuration.General.MountId); From c767fa7679973a30e0236e1793d4fa2ca8069858 Mon Sep 17 00:00:00 2001 From: Plogon Enjoyer Date: Thu, 26 Dec 2024 02:46:01 +0800 Subject: [PATCH 013/109] Added final Wachumeqimeqi quest - Appreciated Value --- .../Wachumeqimeqi/4967_Appreciated Value.json | 253 ++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 QuestPaths/7.x - Dawntrail/Custom Deliveries/Wachumeqimeqi/4967_Appreciated Value.json diff --git a/QuestPaths/7.x - Dawntrail/Custom Deliveries/Wachumeqimeqi/4967_Appreciated Value.json b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Wachumeqimeqi/4967_Appreciated Value.json new file mode 100644 index 000000000..69b00b509 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Wachumeqimeqi/4967_Appreciated Value.json @@ -0,0 +1,253 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "plogon_enjoyer", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1047095, + "Position": { + "X": 139.5437, + "Y": -13.99, + "Z": 10.60498 + }, + "TerritoryId": 1185, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014440, + "Position": { + "X": -100.23657, + "Y": -19.882507, + "Z": 211.13904 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Tuliyollal] Wachumeqimeqi", + "[Tuliyollal] The For'ard Cabins" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1052476, + "Position": { + "X": -100.175476, + "Y": -19.798239, + "Z": 209.73523 + }, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1047183, + "Position": { + "X": -194.93408, + "Y": 28, + "Z": -553.1548 + }, + "TerritoryId": 1191, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Prompt": "TEXT_KINGLZ001_04967_Q2_000_000", + "Type": "List", + "Answer": "TEXT_KINGLZ001_04967_A2_000_001" + } + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1047173, + "Position": { + "X": -283.0396, + "Y": 37.000023, + "Z": -573.7545 + }, + "TerritoryId": 1191, + "InteractionType": "Interact", + "Fly": true + }, + { + "DataId": 1047174, + "Position": { + "X": -138.35364, + "Y": 42.999657, + "Z": -663.2639 + }, + "TerritoryId": 1191, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1047095, + "Position": { + "X": 139.5437, + "Y": -13.99, + "Z": 10.60498 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] Wachumeqimeqi" + ] + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1047177, + "Position": { + "X": -272.54144, + "Y": -9.063631e-6, + "Z": 143.57214 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Tuliyollal] Wachumeqimeqi", + "[Tuliyollal] The For'ard Cabins" + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1047179, + "Position": { + "X": 109.147705, + "Y": 42, + "Z": -353.29218 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Tuliyollal] The For'ard Cabins", + "[Tuliyollal] Brightploom Post" + ] + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1047133, + "Position": { + "X": 180.37683, + "Y": -13.99, + "Z": 1.9073486 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Tuliyollal] Brightploom Post", + "[Tuliyollal] Wachumeqimeqi" + ] + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 2014437, + "Position": { + "X": 166.8269, + "Y": -14.023071, + "Z": 3.2807007 + }, + "TerritoryId": 1185, + "InteractionType": "Interact" + }, + { + "DataId": 2014438, + "Position": { + "X": 203.05176, + "Y": -14.023071, + "Z": 11.642578 + }, + "TerritoryId": 1185, + "InteractionType": "Interact" + }, + { + "DataId": 2014439, + "Position": { + "X": 232.95947, + "Y": -14.023071, + "Z": -9.99469 + }, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 10, + "Steps": [ + { + "DataId": 1047095, + "Position": { + "X": 139.5437, + "Y": -13.99, + "Z": 10.60498 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Prompt": "TEXT_KINGLZ001_04967_Q3_000_302", + "Type": "YesNo", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1047095, + "Position": { + "X": 139.5437, + "Y": -13.99, + "Z": 10.60498 + }, + "TerritoryId": 1185, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From 011c616748170a144cadbfd897b8cbeb43bb67ca Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 00:22:00 +0100 Subject: [PATCH 014/109] Add HW SCH quests --- .../SCH/1102_The Beast Within.json | 3 +- .../SCH/1671_The Green Death.json | 124 ++++++++++++ .../Class Quests/SCH/1672_Quarantine.json | 104 ++++++++++ .../Class Quests/SCH/1673_False Friends.json | 176 ++++++++++++++++ .../Class Quests/SCH/1674_Ooh Rah.json | 128 ++++++++++++ .../Class Quests/SCH/1675_Unseen.json | 163 +++++++++++++++ .../SCH/1676_Forward, the Royal Marines.json | 189 ++++++++++++++++++ QuestPaths/quest-v1.json | 3 +- .../Questing/Converter/EmoteConverter.cs | 1 + Questionable.Model/Questing/EEmote.cs | 1 + 10 files changed, 890 insertions(+), 2 deletions(-) create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SCH/1671_The Green Death.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SCH/1672_Quarantine.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SCH/1673_False Friends.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SCH/1674_Ooh Rah.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SCH/1675_Unseen.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SCH/1676_Forward, the Royal Marines.json diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json index 06d12fb34..002ac1806 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json @@ -119,7 +119,8 @@ "Z": 61.142822 }, "TerritoryId": 139, - "InteractionType": "CompleteQuest" + "InteractionType": "CompleteQuest", + "NextQuestId": 1671 } ] } diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SCH/1671_The Green Death.json b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1671_The Green Death.json new file mode 100644 index 000000000..7f0ebacec --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1671_The Green Death.json @@ -0,0 +1,124 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006757, + "Position": { + "X": -4.4709473, + "Y": 44.999886, + "Z": -250.56848 + }, + "TerritoryId": 128, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2005518, + "Position": { + "X": -275.16595, + "Y": 64.25574, + "Z": -197.34491 + }, + "StopDistance": 0.5, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 4399 + ], + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2005519, + "Position": { + "X": -275.16595, + "Y": 64.25574, + "Z": -197.34491 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "NextQuestId": 1672 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SCH/1672_Quarantine.json b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1672_Quarantine.json new file mode 100644 index 000000000..44ddb4552 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1672_Quarantine.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 620.5845, + "Y": -3.0527442, + "Z": 169.40678 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1013137, + "Position": { + "X": 620.9657, + "Y": -3.002753, + "Z": 171.06885 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2005520, + "Position": { + "X": 622.91907, + "Y": -3.0671387, + "Z": 171.6792 + }, + "StopDistance": 4.5, + "TerritoryId": 139, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "NextQuestId": 1673 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SCH/1673_False Friends.json b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1673_False Friends.json new file mode 100644 index 000000000..192a828a9 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1673_False Friends.json @@ -0,0 +1,176 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -289.83594, + "Y": 70.47664, + "Z": -272.06448 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true + }, + { + "DataId": 2005521, + "Position": { + "X": -292.83594, + "Y": 72.15991, + "Z": -275.4101 + }, + "StopDistance": 0.5, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "ComplexCombatData": [ + { + "DataId": 30, + "NameId": 4108 + } + ], + "Mount": false + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2005522, + "Position": { + "X": -302.05237, + "Y": 70.81714, + "Z": -292.28656 + }, + "StopDistance": 0.5, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "ComplexCombatData": [ + { + "DataId": 30, + "NameId": 4108 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2005523, + "Position": { + "X": -370.04657, + "Y": 65.69006, + "Z": -307.75922 + }, + "StopDistance": 0.5, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2005530, + "Position": { + "X": -381.55188, + "Y": 52.475708, + "Z": -298.93958 + }, + "StopDistance": 2, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 4371 + ], + "DisableNavmesh": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2005531, + "Position": { + "X": -381.55188, + "Y": 52.8114, + "Z": -298.909 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "NextQuestId": 1674 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SCH/1674_Ooh Rah.json b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1674_Ooh Rah.json new file mode 100644 index 000000000..8cbb45184 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1674_Ooh Rah.json @@ -0,0 +1,128 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1013138, + "Position": { + "X": 404.19617, + "Y": -2.6082127, + "Z": 212.1156 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1013138, + "Position": { + "X": 404.19617, + "Y": -2.6082127, + "Z": 212.1156 + }, + "TerritoryId": 139, + "InteractionType": "Say", + "ChatMessage": { + "Key": "TEXT_JOBSCH560_01674_SYSTEM_100_023" + } + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1013138, + "Position": { + "X": 404.19617, + "Y": -2.6082127, + "Z": 212.1156 + }, + "TerritoryId": 139, + "InteractionType": "Say", + "ChatMessage": { + "Key": "TEXT_JOBSCH560_01674_SYSTEM_100_023" + } + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1013139, + "Position": { + "X": 700.9536, + "Y": -0.50953937, + "Z": 133.28748 + }, + "TerritoryId": 139, + "InteractionType": "Combat", + "EnemySpawnType": "AfterEmote", + "KillEnemyDataIds": [ + 4400, + 4401 + ], + "Emote": "laugh", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1013138, + "Position": { + "X": 404.19617, + "Y": -2.6082127, + "Z": 212.1156 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "Fly": true, + "NextQuestId": 1675 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SCH/1675_Unseen.json b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1675_Unseen.json new file mode 100644 index 000000000..ea1a40067 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1675_Unseen.json @@ -0,0 +1,163 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1002279, + "Position": { + "X": -196.8872, + "Y": 18.459997, + "Z": 59.952637 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Thaumaturges' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1011231, + "Position": { + "X": 503.1051, + "Y": 217.95148, + "Z": 790.2189 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "AetheryteShortcut": "Coerthas Western Highlands - Falcon's Nest", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1011234, + "Position": { + "X": 546.1356, + "Y": 217.90826, + "Z": 768.06274 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 528.09424, + "Y": 217.9514, + "Z": 773.35565 + }, + "TerritoryId": 397, + "InteractionType": "WalkTo" + }, + { + "DataId": 2005525, + "Position": { + "X": 446.00586, + "Y": 140.82544, + "Z": -749.87415 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 4374 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + 1, + null, + null, + null, + null, + null + ] + }, + { + "DataId": 2005525, + "Position": { + "X": 446.00586, + "Y": 140.82544, + "Z": -749.87415 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "NextQuestId": 1676 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SCH/1676_Forward, the Royal Marines.json b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1676_Forward, the Royal Marines.json new file mode 100644 index 000000000..8b2a22019 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SCH/1676_Forward, the Royal Marines.json @@ -0,0 +1,189 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2005528, + "Position": { + "X": -381.5824, + "Y": 52.475708, + "Z": -298.81744 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2005529, + "Position": { + "X": 290.15015, + "Y": 41.275635, + "Z": -193.83539 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1013143, + "Position": { + "X": 405.1117, + "Y": 4.109556, + "Z": 81.04065 + }, + "TerritoryId": 139, + "InteractionType": "SinglePlayerDuty", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 489.20578, + "Y": 16.495434, + "Z": 69.11804 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo" + }, + { + "DataId": 1013146, + "Position": { + "X": 489.73828, + "Y": 16.495436, + "Z": 67.33801 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1013147, + "Position": { + "X": 487.84607, + "Y": 16.495436, + "Z": 68.0094 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1013148, + "Position": { + "X": 489.64673, + "Y": 16.495436, + "Z": 70.573 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1013198, + "Position": { + "X": 487.47998, + "Y": 16.495436, + "Z": 70.35925 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1013199, + "Position": { + "X": 491.47778, + "Y": 16.495434, + "Z": 69.16907 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "NextQuestId": 2923 + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 718b36caf..4984fb243 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -858,7 +858,8 @@ "examineself", "joy", "mogdance", - "salute" + "salute", + "laugh" ] } } diff --git a/Questionable.Model/Questing/Converter/EmoteConverter.cs b/Questionable.Model/Questing/Converter/EmoteConverter.cs index 9290a50c5..714282e46 100644 --- a/Questionable.Model/Questing/Converter/EmoteConverter.cs +++ b/Questionable.Model/Questing/Converter/EmoteConverter.cs @@ -18,6 +18,7 @@ public sealed class EmoteConverter() : EnumConverter(Values) { EEmote.Wave, "wave" }, { EEmote.Joy, "joy" }, { EEmote.Kneel, "kneel" }, + { EEmote.Laugh, "laugh" }, { EEmote.Lookout, "lookout" }, { EEmote.Me, "me" }, { EEmote.Deny, "deny" }, diff --git a/Questionable.Model/Questing/EEmote.cs b/Questionable.Model/Questing/EEmote.cs index 4292d1ac4..dc4363aee 100644 --- a/Questionable.Model/Questing/EEmote.cs +++ b/Questionable.Model/Questing/EEmote.cs @@ -19,6 +19,7 @@ public enum EEmote Wave = 16, Joy = 18, Kneel = 19, + Laugh = 21, Lookout = 22, Me = 23, Deny = 25, From cfe8962174186411f1ed375ea07f484791121f4f Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 00:28:09 +0100 Subject: [PATCH 015/109] Update some UI color coding --- .../JournalComponents/AlliedSocietyJournalComponent.cs | 4 ++-- .../Windows/QuestComponents/QuestTooltipComponent.cs | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs b/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs index c7e506029..a5ae13b3e 100644 --- a/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs +++ b/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs @@ -60,7 +60,7 @@ internal sealed class AlliedSocietyJournalComponent string label = $"{alliedSociety}###AlliedSociety{(int)alliedSociety}"; #if DEBUG bool isOpen; - if (quests.Any(x => !_questRegistry.IsKnownQuest(x.QuestId))) + if (quests.Any(x => !_questRegistry.TryGetQuest(x.QuestId, out var quest) || quest.Root.Disabled)) { using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudOrange)) isOpen = ImGui.CollapsingHeader(label); @@ -103,7 +103,7 @@ internal sealed class AlliedSocietyJournalComponent private void DrawQuest(QuestInfo questInfo) { var (color, icon, tooltipText) = _uiUtils.GetQuestStyle(questInfo.QuestId); - if (!_questRegistry.TryGetQuest(questInfo.QuestId, out var quest)) + if (!_questRegistry.TryGetQuest(questInfo.QuestId, out var quest) || quest.Root.Disabled) color = ImGuiColors.DalamudGrey; if (_uiUtils.ChecklistItem($"{questInfo.Name} ({tooltipText})", color, icon)) diff --git a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs index 3f426f6c8..4d4f1d2c3 100644 --- a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs +++ b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs @@ -60,6 +60,12 @@ internal sealed class QuestTooltipComponent if (_questRegistry.TryGetQuest(questInfo.QuestId, out Quest? quest)) { + if (quest.Root.Disabled) + { + ImGui.SameLine(); + ImGui.TextColored(ImGuiColors.DalamudRed, "Disabled"); + } + if (quest.Root.Author.Count == 1) ImGui.Text($"Author: {quest.Root.Author[0]}"); else @@ -68,7 +74,7 @@ internal sealed class QuestTooltipComponent else { ImGui.SameLine(); - ImGui.TextUnformatted("NoQuestPath"); + ImGui.TextColored(ImGuiColors.DalamudRed, "NoQuestPath"); } DrawQuestUnlocks(questInfo, 0); From 4438d6fea23dff982783d0b6dcb0b5a0a724f1ef Mon Sep 17 00:00:00 2001 From: Taurenkey Date: Thu, 26 Dec 2024 11:35:26 +0000 Subject: [PATCH 016/109] Fix context popups --- Questionable/Windows/JournalComponents/QuestJournalUtils.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs index c98dba68c..40f59278a 100644 --- a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs +++ b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs @@ -24,7 +24,10 @@ internal sealed class QuestJournalUtils public void ShowContextMenu(IQuestInfo questInfo, Quest? quest, string label) { - using var popup = ImRaii.ContextPopup($"##QuestPopup{questInfo.QuestId}", ImGuiPopupFlags.MouseButtonRight); + if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) + ImGui.OpenPopup($"##QuestPopup{questInfo.QuestId}"); + + using var popup = ImRaii.Popup($"##QuestPopup{questInfo.QuestId}"); if (!popup) return; From e5d1bcedcdade108273406d329a0fca251cbe528 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 14:15:43 +0100 Subject: [PATCH 017/109] Add SB SCH quests --- .../SCH/2923_The Vanishing Act.json | 128 +++++++++++++ .../SCH/2924_A Safe Place to Hide.json | 174 ++++++++++++++++++ .../SCH/2925_In Loving Memory.json | 60 ++++++ .../Class Quests/SCH/2926_The Chase.json | 139 ++++++++++++++ .../SCH/2927_Our Unsung Heroes.json | 143 ++++++++++++++ QuestPaths/quest-v1.json | 3 +- .../Questing/Converter/ActionConverter.cs | 1 + Questionable.Model/Questing/EAction.cs | 1 + 8 files changed, 648 insertions(+), 1 deletion(-) create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SCH/2923_The Vanishing Act.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SCH/2924_A Safe Place to Hide.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SCH/2925_In Loving Memory.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SCH/2926_The Chase.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SCH/2927_Our Unsung Heroes.json diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SCH/2923_The Vanishing Act.json b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2923_The Vanishing Act.json new file mode 100644 index 000000000..b51500385 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2923_The Vanishing Act.json @@ -0,0 +1,128 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006757, + "Position": { + "X": -4.4709473, + "Y": 44.999886, + "Z": -250.56848 + }, + "TerritoryId": 128, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1009552, + "Position": { + "X": 96.025024, + "Y": 40.247147, + "Z": 60.68506 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "TerritoryId": 145, + "InteractionType": "UseItem", + "ItemId": 30362, + "TargetTerritoryId": 140 + }, + { + "DataId": 1021904, + "Position": { + "X": -480.5829, + "Y": 23.11398, + "Z": -315.81604 + }, + "TerritoryId": 140, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "NextQuestId": 2924 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SCH/2924_A Safe Place to Hide.json b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2924_A Safe Place to Hide.json new file mode 100644 index 000000000..e5c3bb853 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2924_A Safe Place to Hide.json @@ -0,0 +1,174 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006757, + "Position": { + "X": -4.4709473, + "Y": 44.999886, + "Z": -250.56848 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021905, + "Position": { + "X": -220.17242, + "Y": 20.83071, + "Z": 353.16992 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "AetheryteShortcut": "South Shroud - Camp Tranquil" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008554, + "Position": { + "X": -230.18237, + "Y": 1.3274536, + "Z": 406.3629 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2008555, + "Position": { + "X": -182.8794, + "Y": 0.3508911, + "Z": 463.76733 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2008556, + "Position": { + "X": -81.71216, + "Y": 1.2054443, + "Z": 395.71216 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": -69.98173, + "Y": 0.9259782, + "Z": 361.20602 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7237, + 7494, + 7499 + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1021910, + "Position": { + "X": -70.115234, + "Y": 0.94099265, + "Z": 360.3723 + }, + "TerritoryId": 153, + "InteractionType": "Action", + "Action": "Adloquium" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "TerritoryId": 153, + "InteractionType": "CompleteQuest", + "Fly": true, + "NextQuestId": 2925 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SCH/2925_In Loving Memory.json b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2925_In Loving Memory.json new file mode 100644 index 000000000..69e065cec --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2925_In Loving Memory.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "TerritoryId": 153, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021913, + "Position": { + "X": 161.39453, + "Y": 37.625904, + "Z": 169.17664 + }, + "TerritoryId": 153, + "InteractionType": "SinglePlayerDuty", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "StopDistance": 5, + "TerritoryId": 153, + "InteractionType": "CompleteQuest", + "NextQuestId": 2926 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SCH/2926_The Chase.json b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2926_The Chase.json new file mode 100644 index 000000000..9aa571e57 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2926_The Chase.json @@ -0,0 +1,139 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "StopDistance": 5, + "TerritoryId": 153, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "AetheryteShortcut": "South Shroud - Camp Tranquil" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008557, + "Position": { + "X": -160.08246, + "Y": 1.9683228, + "Z": 175.52454 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2008558, + "Position": { + "X": -150.19464, + "Y": 4.714966, + "Z": 52.109497 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2008559, + "Position": { + "X": -250.5379, + "Y": 16.830688, + "Z": 19.21106 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 6621 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "TerritoryId": 153, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "NextQuestId": 2927 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SCH/2927_Our Unsung Heroes.json b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2927_Our Unsung Heroes.json new file mode 100644 index 000000000..1d490ba68 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SCH/2927_Our Unsung Heroes.json @@ -0,0 +1,143 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "TerritoryId": 153, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021917, + "Position": { + "X": -343.80103, + "Y": -0.3600377, + "Z": 448.1117 + }, + "TerritoryId": 153, + "InteractionType": "SinglePlayerDuty", + "Fly": true + } + ] + }, + { + "Sequence": 2 + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1021911, + "Position": { + "X": -220.84387, + "Y": 21.261763, + "Z": 363.39355 + }, + "TerritoryId": 153, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 207.68561, + "Y": -3.1246834, + "Z": 42.986313 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1013135, + "Position": { + "X": 206.0426, + "Y": -3.111818, + "Z": 41.94702 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1021919, + "Position": { + "X": 207.53784, + "Y": -3.049824, + "Z": 43.22876 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1021918, + "Position": { + "X": 206.80542, + "Y": -3.065022, + "Z": 43.83911 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 4984fb243..3b7eeb318 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -980,7 +980,8 @@ "Slug Shot", "Bosom Brook", "Souleater", - "Fire III" + "Fire III", + "Adloquium" ] } }, diff --git a/Questionable.Model/Questing/Converter/ActionConverter.cs b/Questionable.Model/Questing/Converter/ActionConverter.cs index 8d211442f..d5b1128f2 100644 --- a/Questionable.Model/Questing/Converter/ActionConverter.cs +++ b/Questionable.Model/Questing/Converter/ActionConverter.cs @@ -45,5 +45,6 @@ public sealed class ActionConverter() : EnumConverter(Values) { EAction.BosomBrook, "Bosom Brook" }, { EAction.Souleater, "Souleater" }, { EAction.Fire3, "Fire III" }, + { EAction.Adloquium, "Adloquium" }, }; } diff --git a/Questionable.Model/Questing/EAction.cs b/Questionable.Model/Questing/EAction.cs index ed4d6e83e..b4bd7c2be 100644 --- a/Questionable.Model/Questing/EAction.cs +++ b/Questionable.Model/Questing/EAction.cs @@ -51,6 +51,7 @@ public enum EAction BosomBrook = 37173, Souleater = 3632, Fire3 = 152, + Adloquium = 185, CollectMiner = 240, ScourMiner = 22182, From cc18f39ff6ad0684dde958c4f65ed2f41c4357a6 Mon Sep 17 00:00:00 2001 From: Plogon Enjoyer Date: Thu, 26 Dec 2024 21:39:09 +0800 Subject: [PATCH 018/109] Updated and enabled quest 'Foundations of Steel' --- .../Dailies/3908_Foundations of Steel.json | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3908_Foundations of Steel.json b/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3908_Foundations of Steel.json index 24aad0b4b..3406aac8c 100644 --- a/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3908_Foundations of Steel.json +++ b/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3908_Foundations of Steel.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", - "Author": "liza", - "Disabled": true, + "Author": "plogon_enjoyer", "QuestSequence": [ { "Sequence": 0, @@ -30,11 +29,28 @@ { "Sequence": 1, "Steps": [ + { + "DataId": 1034118, + "Position": { + "X": -55.49713, + "Y": 98.10251, + "Z": -624.7501 + }, + "TerritoryId": 813, + "InteractionType": "Interact", + "Fly": true + } ] }, { "Sequence": 255, "Steps": [ + { + "TerritoryId": 813, + "InteractionType": "Craft", + "ItemId": 31157, + "ItemCount": 3 + }, { "Position": { "X": -615.73865, From e25e64e9cf26627de58c6ee31cf7dd68d715acf7 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 14:58:10 +0100 Subject: [PATCH 019/109] Add HW SMN quests --- .../SMN/2100_A Fitting Tomestone.json | 88 +++++++++ .../SMN/2101_A Matter of Fact.json | 182 ++++++++++++++++++ .../SMN/2102_A Miner Negotiation.json | 151 +++++++++++++++ .../SMN/2103_Mad, Bad, and Ebon-clad.json | 113 +++++++++++ .../2104_I Could Have Tranced All Night.json | 99 ++++++++++ .../SMN/2105_A Flare for the Dramatic.json | 79 ++++++++ 6 files changed, 712 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SMN/2100_A Fitting Tomestone.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SMN/2101_A Matter of Fact.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SMN/2102_A Miner Negotiation.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SMN/2103_Mad, Bad, and Ebon-clad.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SMN/2104_I Could Have Tranced All Night.json create mode 100644 QuestPaths/3.x - Heavensward/Class Quests/SMN/2105_A Flare for the Dramatic.json diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SMN/2100_A Fitting Tomestone.json b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2100_A Fitting Tomestone.json new file mode 100644 index 000000000..dbe21b54a --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2100_A Fitting Tomestone.json @@ -0,0 +1,88 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006725, + "Position": { + "X": 446.82983, + "Y": -5.306207, + "Z": -465.72064 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "AetheryteShortcut": "Mor Dhona", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1014018, + "Position": { + "X": 481.9867, + "Y": 5.4917006, + "Z": -838.52905 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "NextQuestId": 2101 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SMN/2101_A Matter of Fact.json b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2101_A Matter of Fact.json new file mode 100644 index 000000000..5d1cfbf9f --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2101_A Matter of Fact.json @@ -0,0 +1,182 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014020, + "Position": { + "X": -416.70862, + "Y": -55.58494, + "Z": 112.38269 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1004506, + "Position": { + "X": -416.64764, + "Y": -54.15, + "Z": 96.42175 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1003931, + "Position": { + "X": -379.6292, + "Y": -55.85506, + "Z": 95.04846 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1004556, + "Position": { + "X": -394.85773, + "Y": -57.30005, + "Z": 173.32715 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014020, + "Position": { + "X": -416.70862, + "Y": -55.58494, + "Z": 112.38269 + }, + "TerritoryId": 145, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -194.28932, + "Y": -36.84067, + "Z": 26.942286 + }, + "StopDistance": 0.5, + "TerritoryId": 145, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 4777, + 4778 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + { + "Low": 3 + }, + null, + null, + null, + null, + null + ] + }, + { + "DataId": 1014025, + "Position": { + "X": -193.59125, + "Y": -36.83681, + "Z": 25.894531 + }, + "TerritoryId": 145, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "NextQuestId": 2102 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SMN/2102_A Miner Negotiation.json b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2102_A Miner Negotiation.json new file mode 100644 index 000000000..911fbc1c5 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2102_A Miner Negotiation.json @@ -0,0 +1,151 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014029, + "Position": { + "X": 45.24292, + "Y": 18, + "Z": -414.87756 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Thanalan - Black Brush Station", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2005969, + "Position": { + "X": -4.5319824, + "Y": 27.695068, + "Z": -422.2019 + }, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 4781 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2005970, + "Position": { + "X": -29.160034, + "Y": 27.42041, + "Z": -417.99042 + }, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 4781 + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2005971, + "Position": { + "X": -11.6427, + "Y": 34.01233, + "Z": -458.60992 + }, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 4781, + 4786 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014029, + "Position": { + "X": 45.24292, + "Y": 18, + "Z": -414.87756 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "NextQuestId": 2103 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SMN/2103_Mad, Bad, and Ebon-clad.json b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2103_Mad, Bad, and Ebon-clad.json new file mode 100644 index 000000000..3cb898118 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2103_Mad, Bad, and Ebon-clad.json @@ -0,0 +1,113 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014033, + "Position": { + "X": 47.16565, + "Y": 4, + "Z": 466.14783 + }, + "TerritoryId": 147, + "InteractionType": "Interact", + "AetheryteShortcut": "Northern Thanalan - Camp Bluefog" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2005972, + "Position": { + "X": -6.8513794, + "Y": 5.722107, + "Z": 290.8827 + }, + "StopDistance": 1, + "TerritoryId": 147, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 13.795937, + "Y": 5.0408907, + "Z": 280.2135 + }, + "StopDistance": 0.5, + "TerritoryId": 147, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 4787, + 4788 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1014034, + "Position": { + "X": 13.687317, + "Y": 4.983316, + "Z": 284.38232 + }, + "StopDistance": 7, + "TerritoryId": 147, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "NextQuestId": 2104 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SMN/2104_I Could Have Tranced All Night.json b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2104_I Could Have Tranced All Night.json new file mode 100644 index 000000000..a568b7b49 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2104_I Could Have Tranced All Night.json @@ -0,0 +1,99 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014038, + "Position": { + "X": -20.24878, + "Y": 83.19998, + "Z": -1.4801636 + }, + "TerritoryId": 130, + "InteractionType": "SinglePlayerDuty", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Airship Landing" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "NextQuestId": 2105 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Class Quests/SMN/2105_A Flare for the Dramatic.json b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2105_A Flare for the Dramatic.json new file mode 100644 index 000000000..46e628c89 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Class Quests/SMN/2105_A Flare for the Dramatic.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014028, + "Position": { + "X": -126.57361, + "Y": 4.0999947, + "Z": -96.23871 + }, + "TerritoryId": 130, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014042, + "Position": { + "X": 277.11902, + "Y": 232.54102, + "Z": 760.1892 + }, + "TerritoryId": 399, + "InteractionType": "SinglePlayerDuty", + "AetheryteShortcut": "Idyllshire", + "AethernetShortcut": [ + "[Idyllshire] Aetheryte Plaza", + "[Idyllshire] Prologue Gate (Western Hinterlands)" + ], + "$": "Unsure if this works without flying unlocked" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1014045, + "Position": { + "X": 260.5172, + "Y": 232.54103, + "Z": 728.9081 + }, + "TerritoryId": 399, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1014044, + "Position": { + "X": 264.515, + "Y": 232.54102, + "Z": 728.84717 + }, + "StopDistance": 7, + "TerritoryId": 399, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From 8ab584d55ee4b4d236d0629b367ff02ae0603bff Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 14:58:33 +0100 Subject: [PATCH 020/109] Only show NameId if it isn't 0 --- Questionable/Windows/QuestComponents/CreationUtilsComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs b/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs index be6f31c19..f18c2fcc8 100644 --- a/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs +++ b/Questionable/Windows/QuestComponents/CreationUtilsComponent.cs @@ -201,7 +201,7 @@ internal sealed class CreationUtilsComponent private unsafe void DrawTargetDetails(IGameObject target) { string nameId = string.Empty; - if (target is ICharacter character) + if (target is ICharacter { NameId: > 0 } character) nameId = $"; n={character.NameId}"; ImGui.Separator(); From 2be0ab85d308df31412ec3035a87a7c59fc4e970 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 15:04:47 +0100 Subject: [PATCH 021/109] Add 'Unbreakable Plate' dwarves quest --- .../Dailies/3921_Unbreakable Plate.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3921_Unbreakable Plate.json b/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3921_Unbreakable Plate.json index 24aad0b4b..b15979521 100644 --- a/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3921_Unbreakable Plate.json +++ b/QuestPaths/5.x - Shadowbringers/Allied Societies/Dwarves/Dailies/3921_Unbreakable Plate.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -30,11 +29,28 @@ { "Sequence": 1, "Steps": [ + { + "DataId": 1033704, + "Position": { + "X": -33.341064, + "Y": 21.204435, + "Z": -198.41309 + }, + "TerritoryId": 813, + "InteractionType": "Interact", + "Fly": true + } ] }, { "Sequence": 255, "Steps": [ + { + "TerritoryId": 813, + "InteractionType": "Craft", + "ItemId": 31175, + "ItemCount": 1 + }, { "Position": { "X": -615.73865, From b97600bd6fb1d8e691e9a05cbc13163113502a4a Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 15:26:41 +0100 Subject: [PATCH 022/109] Add 'Ants in the Pants' Ananta quest --- .../Dailies/3061_Ants in the Pants.json | 32 +++++++++++- .../CombatModules/Mount147Module.cs | 51 +++++++++++++++++++ .../Controller/Steps/Interactions/Combat.cs | 3 +- Questionable/Controller/Steps/QuestCleanUp.cs | 2 +- Questionable/Data/AlliedSocietyData.cs | 1 + Questionable/QuestionablePlugin.cs | 1 + 6 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 Questionable/Controller/CombatModules/Mount147Module.cs diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Ananta/Dailies/3061_Ants in the Pants.json b/QuestPaths/4.x - Stormblood/Allied Societies/Ananta/Dailies/3061_Ants in the Pants.json index 48f32de4b..6592441bf 100644 --- a/QuestPaths/4.x - Stormblood/Allied Societies/Ananta/Dailies/3061_Ants in the Pants.json +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Ananta/Dailies/3061_Ants in the Pants.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -22,6 +21,37 @@ { "Sequence": 1, "Steps": [ + { + "DataId": 1024777, + "Position": { + "X": -41.641907, + "Y": 55.97816, + "Z": 211.38318 + }, + "TerritoryId": 612, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 482.93036, + "Y": 42.43753, + "Z": 350.85095 + }, + "StopDistance": 0.5, + "TerritoryId": 612, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 8593 + ], + "Fly": true, + "Land": true + } ] }, { diff --git a/Questionable/Controller/CombatModules/Mount147Module.cs b/Questionable/Controller/CombatModules/Mount147Module.cs new file mode 100644 index 000000000..f0c43176d --- /dev/null +++ b/Questionable/Controller/CombatModules/Mount147Module.cs @@ -0,0 +1,51 @@ +using System; +using System.Numerics; +using Dalamud.Game.ClientState.Objects.Types; +using Questionable.Functions; +using Questionable.Model; +using Questionable.Model.Questing; + +namespace Questionable.Controller.CombatModules; + +/// +/// Commandeered Magitek Armor; used in 'Magiteknical Failure' quest. +/// +internal sealed class Mount147Module : ICombatModule +{ + public const ushort MountId = 147; + private readonly EAction[] _actions = [EAction.Trample]; + + private readonly MovementController _movementController; + private readonly GameFunctions _gameFunctions; + + + public Mount147Module(MovementController movementController, GameFunctions gameFunctions) + { + _movementController = movementController; + _gameFunctions = gameFunctions; + } + + public bool CanHandleFight(CombatController.CombatData combatData) => _gameFunctions.GetMountId() == MountId; + + public bool Start(CombatController.CombatData combatData) => true; + + public bool Stop() => true; + + public void Update(IGameObject gameObject) + { + if (_movementController.IsPathfinding || _movementController.IsPathRunning) + return; + + foreach (EAction action in _actions) + { + if (_gameFunctions.UseAction(gameObject, action, checkCanUse: false)) + return; + } + } + + public void MoveToTarget(IGameObject gameObject) + { + } + + public bool CanAttack(IBattleNpc target) => target.DataId is 8593; +} diff --git a/Questionable/Controller/Steps/Interactions/Combat.cs b/Questionable/Controller/Steps/Interactions/Combat.cs index f0b7ff15f..c0a09a3af 100644 --- a/Questionable/Controller/Steps/Interactions/Combat.cs +++ b/Questionable/Controller/Steps/Interactions/Combat.cs @@ -22,7 +22,8 @@ internal static class Combat ArgumentNullException.ThrowIfNull(step.EnemySpawnType); - if (gameFunctions.GetMountId() != Mount128Module.MountId) + if (gameFunctions.GetMountId() != Mount128Module.MountId && + gameFunctions.GetMountId() != Mount147Module.MountId) yield return new Mount.UnmountTask(); if (step.CombatDelaySecondsAtStart != null) diff --git a/Questionable/Controller/Steps/QuestCleanUp.cs b/Questionable/Controller/Steps/QuestCleanUp.cs index d5564180b..d9c7701f5 100644 --- a/Questionable/Controller/Steps/QuestCleanUp.cs +++ b/Questionable/Controller/Steps/QuestCleanUp.cs @@ -38,7 +38,7 @@ internal static class QuestCleanUp } // if the quest uses no mount actions, that's not a mount quest - if (!quest.AllSteps().Any(x => x.Step.Action is { } action && action.RequiresMount())) + if (!quest.AllSteps().Any(x => (x.Step.Action is { } action && action.RequiresMount()) || (x.Step.InteractionType == EInteractionType.Combat && x.Step.KillEnemyDataIds.Contains(8593)))) { logger.LogInformation("Quest doesn't use any mount actions, teleporting to {Aetheryte}", mountConfiguration.ClosestAetheryte); return teleportTask; diff --git a/Questionable/Data/AlliedSocietyData.cs b/Questionable/Data/AlliedSocietyData.cs index 0ac4db072..4d3885395 100644 --- a/Questionable/Data/AlliedSocietyData.cs +++ b/Questionable/Data/AlliedSocietyData.cs @@ -16,6 +16,7 @@ internal sealed class AlliedSocietyData { 66, new(1016093, EAetheryteLocation.SeaOfCloudsOkZundu) }, { 79, new(1017031, EAetheryteLocation.DravanianForelandsAnyxTrine) }, { 89, new(1017322, EAetheryteLocation.ChurningMistsZenith) }, + { 147, new(1024777, EAetheryteLocation.FringesPeeringStones) }, { 369, new(1051798, EAetheryteLocation.KozamaukaDockPoga) }, }.AsReadOnly(); diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 73af794f6..6c89d5ad5 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -246,6 +246,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); From 31e7b610e136054545808e4b75cb37d42b81b0e4 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 15:37:51 +0100 Subject: [PATCH 023/109] Add Kobold quest templates --- .../Dailies/1325_Rubbish for Refuse.json | 38 +++++++++++++++++++ .../1326_No Such Thing as a Free Lunch.json | 38 +++++++++++++++++++ .../Dailies/1327_Finger Licking Good.json | 38 +++++++++++++++++++ .../1328_Battle of the Bottom-feeders.json | 38 +++++++++++++++++++ .../Dailies/1329_Mothers of All Bombs.json | 38 +++++++++++++++++++ .../Kobolds/Dailies/1330_Know Your Place.json | 38 +++++++++++++++++++ .../Dailies/1331_Misery Loves Company.json | 38 +++++++++++++++++++ .../Dailies/1332_Ill-gotten Gains.json | 38 +++++++++++++++++++ .../Dailies/1333_Hells Have No Fury.json | 38 +++++++++++++++++++ .../Dailies/1334_Bo Zu's Blown Cover.json | 38 +++++++++++++++++++ .../Dailies/1335_Ambushing the Assessors.json | 38 +++++++++++++++++++ .../Dailies/1336_The Lode Warrior.json | 38 +++++++++++++++++++ .../Dailies/1337_Armed and Dangerous.json | 38 +++++++++++++++++++ .../Dailies/1338_Too Hot to Handle.json | 38 +++++++++++++++++++ .../Dailies/1339_Operation Riffraff.json | 38 +++++++++++++++++++ .../Dailies/1340_The Sly Salvages.json | 38 +++++++++++++++++++ .../Dailies/1341_Belles of the Ball.json | 38 +++++++++++++++++++ .../Dailies/1342_Contents Unknown.json | 38 +++++++++++++++++++ .../Kobolds/Dailies/1343_Brain Buster.json | 38 +++++++++++++++++++ .../Dailies/1344_A Dangerous Delivery.json | 38 +++++++++++++++++++ .../Dailies/1364_A Coblyn Catastrophe.json | 38 +++++++++++++++++++ .../Dailies/1365_Friends in Low Places.json | 38 +++++++++++++++++++ .../Dailies/1366_Glutton for Punishment.json | 38 +++++++++++++++++++ .../Kobolds/Dailies/1367_Genius at Work.json | 38 +++++++++++++++++++ .../Dailies/1368_Fulminating Furnaces.json | 38 +++++++++++++++++++ .../1369_A Meal Fit for a Fugleman.json | 38 +++++++++++++++++++ .../Dailies/1370_Spread the Wealth.json | 38 +++++++++++++++++++ .../Kobolds/Dailies/1371_Ba Go's Behest.json | 38 +++++++++++++++++++ .../Dailies/1372_Wrath of the Roundsman.json | 38 +++++++++++++++++++ .../Dailies/1373_Angry Angry Acolyte.json | 38 +++++++++++++++++++ 30 files changed, 1140 insertions(+) create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1325_Rubbish for Refuse.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1329_Mothers of All Bombs.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1330_Know Your Place.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1331_Misery Loves Company.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1332_Ill-gotten Gains.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1333_Hells Have No Fury.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1334_Bo Zu's Blown Cover.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1335_Ambushing the Assessors.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1336_The Lode Warrior.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1340_The Sly Salvages.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1341_Belles of the Ball.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1342_Contents Unknown.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1343_Brain Buster.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1364_A Coblyn Catastrophe.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1365_Friends in Low Places.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1367_Genius at Work.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1368_Fulminating Furnaces.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1369_A Meal Fit for a Fugleman.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1371_Ba Go's Behest.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1372_Wrath of the Roundsman.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1373_Angry Angry Acolyte.json diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1325_Rubbish for Refuse.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1325_Rubbish for Refuse.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1325_Rubbish for Refuse.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1329_Mothers of All Bombs.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1329_Mothers of All Bombs.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1329_Mothers of All Bombs.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1330_Know Your Place.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1330_Know Your Place.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1330_Know Your Place.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1331_Misery Loves Company.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1331_Misery Loves Company.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1331_Misery Loves Company.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1332_Ill-gotten Gains.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1332_Ill-gotten Gains.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1332_Ill-gotten Gains.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1333_Hells Have No Fury.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1333_Hells Have No Fury.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1333_Hells Have No Fury.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1334_Bo Zu's Blown Cover.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1334_Bo Zu's Blown Cover.json new file mode 100644 index 000000000..e84dfd387 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1334_Bo Zu's Blown Cover.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005928, + "Position": { + "X": 7.095398, + "Y": 16.167778, + "Z": -188.67786 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1335_Ambushing the Assessors.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1335_Ambushing the Assessors.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1335_Ambushing the Assessors.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1336_The Lode Warrior.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1336_The Lode Warrior.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1336_The Lode Warrior.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1340_The Sly Salvages.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1340_The Sly Salvages.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1340_The Sly Salvages.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1341_Belles of the Ball.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1341_Belles of the Ball.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1341_Belles of the Ball.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1342_Contents Unknown.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1342_Contents Unknown.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1342_Contents Unknown.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1343_Brain Buster.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1343_Brain Buster.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1343_Brain Buster.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json new file mode 100644 index 000000000..e1d2e1859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005929, + "Position": { + "X": 21.560913, + "Y": 16.342407, + "Z": -183.76447 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1364_A Coblyn Catastrophe.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1364_A Coblyn Catastrophe.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1364_A Coblyn Catastrophe.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1365_Friends in Low Places.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1365_Friends in Low Places.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1365_Friends in Low Places.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1367_Genius at Work.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1367_Genius at Work.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1367_Genius at Work.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1368_Fulminating Furnaces.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1368_Fulminating Furnaces.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1368_Fulminating Furnaces.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1369_A Meal Fit for a Fugleman.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1369_A Meal Fit for a Fugleman.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1369_A Meal Fit for a Fugleman.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1371_Ba Go's Behest.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1371_Ba Go's Behest.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1371_Ba Go's Behest.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1372_Wrath of the Roundsman.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1372_Wrath of the Roundsman.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1372_Wrath of the Roundsman.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1373_Angry Angry Acolyte.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1373_Angry Angry Acolyte.json new file mode 100644 index 000000000..b100ce645 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1373_Angry Angry Acolyte.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "Disabled": true, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005930, + "Position": { + "X": 12.558105, + "Y": 16.159302, + "Z": -176.5622 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From d0f6db2fb826f03159a083c6445c90e43f3cf776 Mon Sep 17 00:00:00 2001 From: Plogon Enjoyer Date: Thu, 26 Dec 2024 22:53:16 +0800 Subject: [PATCH 024/109] Added new moogle mount and mount NPC --- Questionable/Data/AlliedSocietyData.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Questionable/Data/AlliedSocietyData.cs b/Questionable/Data/AlliedSocietyData.cs index 4d3885395..11ea03a12 100644 --- a/Questionable/Data/AlliedSocietyData.cs +++ b/Questionable/Data/AlliedSocietyData.cs @@ -15,6 +15,7 @@ internal sealed class AlliedSocietyData { { 66, new(1016093, EAetheryteLocation.SeaOfCloudsOkZundu) }, { 79, new(1017031, EAetheryteLocation.DravanianForelandsAnyxTrine) }, + { 88, new(1017470, EAetheryteLocation.ChurningMistsZenith) }, { 89, new(1017322, EAetheryteLocation.ChurningMistsZenith) }, { 147, new(1024777, EAetheryteLocation.FringesPeeringStones) }, { 369, new(1051798, EAetheryteLocation.KozamaukaDockPoga) }, @@ -52,7 +53,7 @@ internal sealed class AlliedSocietyData else if (alliedSociety == EAlliedSociety.Moogles) { normalNpcs = []; - mountNpcs = [1017322]; + mountNpcs = [1017322, 1017470]; } else { From 71922b76b79d893382f7436a1a3538389fc7ba7d Mon Sep 17 00:00:00 2001 From: Plogon Enjoyer Date: Thu, 26 Dec 2024 22:53:42 +0800 Subject: [PATCH 025/109] Added new action 'Roar' --- QuestPaths/quest-v1.json | 1 + Questionable.Model/Questing/Converter/ActionConverter.cs | 1 + Questionable.Model/Questing/EAction.cs | 2 ++ 3 files changed, 4 insertions(+) diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 3b7eeb318..247628f85 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -963,6 +963,7 @@ "Buffet (Griffin)", "Trample", "Fumigate", + "Roar", "Seed", "Inhale", "Siphon Snout", diff --git a/Questionable.Model/Questing/Converter/ActionConverter.cs b/Questionable.Model/Questing/Converter/ActionConverter.cs index d5b1128f2..0f72c7317 100644 --- a/Questionable.Model/Questing/Converter/ActionConverter.cs +++ b/Questionable.Model/Questing/Converter/ActionConverter.cs @@ -27,6 +27,7 @@ public sealed class ActionConverter() : EnumConverter(Values) { EAction.BuffetGriffin, "Buffet (Griffin)" }, { EAction.Trample, "Trample" }, { EAction.Fumigate, "Fumigate" }, + { EAction.Roar, "Roar" }, { EAction.Seed, "Seed" }, { EAction.Inhale, "Inhale" }, { EAction.SiphonSnout, "Siphon Snout" }, diff --git a/Questionable.Model/Questing/EAction.cs b/Questionable.Model/Questing/EAction.cs index b4bd7c2be..3a4981af6 100644 --- a/Questionable.Model/Questing/EAction.cs +++ b/Questionable.Model/Questing/EAction.cs @@ -26,6 +26,7 @@ public enum EAction BuffetGriffin = 4583, Trample = 4585, Fumigate = 5872, + Roar = 6293, Seed = 6294, MagitekPulse = 8624, MagitekThunder = 8625, @@ -81,6 +82,7 @@ public static class EActionExtensions or EAction.BuffetGriffin or EAction.Trample or EAction.Fumigate + or EAction.Roar or EAction.Seed or EAction.Inhale or EAction.SiphonSnout From e2757a8bd72a65b7906a7b3a8df286c49bfe9a9a Mon Sep 17 00:00:00 2001 From: Plogon Enjoyer Date: Thu, 26 Dec 2024 22:55:25 +0800 Subject: [PATCH 026/109] Added new Moogle daily quests: - Stumbling Blocks - Tricks without Treats - For Moogles in Peril --- .../Dailies/2300_Stumbling Blocks.json | 63 +++++++++++++++- .../Dailies/2301_Tricks without Treats.json | 73 ++++++++++++++++++- .../Dailies/2302_For Moogles in Peril.json | 70 +++++++++++++++++- 3 files changed, 200 insertions(+), 6 deletions(-) diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2300_Stumbling Blocks.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2300_Stumbling Blocks.json index 1a867f707..9dce2e4eb 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2300_Stumbling Blocks.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2300_Stumbling Blocks.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", - "Author": "liza", - "Disabled": true, + "Author": "plogon_enjoyer", "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,66 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017383, + "Position": { + "X": -657.46545, + "Y": 73.76131, + "Z": 219.28735 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15733, + "ItemCount": 1 + }, + { + "DataId": 1017384, + "Position": { + "X": -651.51447, + "Y": 73, + "Z": 217.2732 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Prompt": "TEXT_BANMOG303_02300_Q1_000_000", + "Type": "List", + "Answer": "TEXT_BANMOG303_02300_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1017387, + "Position": { + "X": -59.55603, + "Y": -8.685017, + "Z": 186.84668 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2301_Tricks without Treats.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2301_Tricks without Treats.json index 1a867f707..eb345812f 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2301_Tricks without Treats.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2301_Tricks without Treats.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", - "Author": "liza", - "Disabled": true, + "Author": "plogon_enjoyer", "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,76 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017321, + "Position": { + "X": -376.4859, + "Y": 60.89619, + "Z": 319.7832 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15734, + "ItemCount": 1 + }, + { + "DataId": 1017392, + "Position": { + "X": 112.687744, + "Y": -24.088774, + "Z": 167.74243 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007234, + "Position": { + "X": 111.86377, + "Y": -21.988281, + "Z": 192.43152 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1017392, + "Position": { + "X": 112.687744, + "Y": -24.088774, + "Z": 167.74243 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2302_For Moogles in Peril.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2302_For Moogles in Peril.json index 1a867f707..75497f355 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2302_For Moogles in Peril.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2302_For Moogles in Peril.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", - "Author": "liza", - "Disabled": true, + "Author": "plogon_enjoyer", "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,73 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017470, + "Position": { + "X": -353.53632, + "Y": 60.896175, + "Z": 299.61084 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007272, + "Position": { + "X": 306.53845, + "Y": -38.254395, + "Z": 111.0094 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007273, + "Position": { + "X": 431.99805, + "Y": -28.152893, + "Z": 112.321655 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2007274, + "Position": { + "X": 390.70715, + "Y": -35.599304, + "Z": 252.58252 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ From ebd73bb6fcdee11484b093365fa2feefca745863 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 15:59:30 +0100 Subject: [PATCH 027/109] Add some kobold dailies --- .../1326_No Such Thing as a Free Lunch.json | 74 +++++++++++++++- .../Dailies/1327_Finger Licking Good.json | 40 ++++++++- .../1328_Battle of the Bottom-feeders.json | 21 ++++- .../Dailies/1337_Armed and Dangerous.json | 56 +++++++++++- .../Dailies/1338_Too Hot to Handle.json | 23 ++++- .../Dailies/1366_Glutton for Punishment.json | 88 ++++++++++++++++++- 6 files changed, 296 insertions(+), 6 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json index e84dfd387..95440de5a 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1326_No Such Thing as a Free Lunch.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,79 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 11.243606, + "Y": 49.8394, + "Z": -374.39398 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + } + }, + { + "DataId": 2003774, + "Position": { + "X": 10.269287, + "Y": 49.82068, + "Z": -375.5398 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2004022, + "Position": { + "X": 39.139404, + "Y": 48.2948, + "Z": -342.33618 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + }, + { + "DataId": 2004020, + "Position": { + "X": 51.102417, + "Y": 48.2948, + "Z": -349.50793 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json index e84dfd387..5354bb26e 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1327_Finger Licking Good.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,45 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -1.668298, + "Y": 48.422268, + "Z": -312.28842 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 327, + "MinimumKillCount": 3, + "RewardItemId": 2001266, + "RewardItemCount": 3 + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1005932, + "Position": { + "X": -1.236023, + "Y": 33.38838, + "Z": -244.19019 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json index e84dfd387..aea657e90 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1328_Battle of the Bottom-feeders.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,26 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 65.98078, + "Y": 57.753456, + "Z": -310.697 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [ + 755, + 2881 + ], + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json index e1d2e1859..e6436230c 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1337_Armed and Dangerous.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,61 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1005932, + "Position": { + "X": -1.236023, + "Y": 33.38838, + "Z": -244.19019 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2003686, + "Position": { + "X": 57.602783, + "Y": 48.111572, + "Z": -388.29633 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "KillEnemyDataIds": [ + 2899, + 2900, + 2901 + ], + "ItemId": 2001226, + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1005932, + "Position": { + "X": -1.236023, + "Y": 33.38838, + "Z": -244.19019 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json index e1d2e1859..4294e085f 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1338_Too Hot to Handle.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,28 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 51.48164, + "Y": 55.599014, + "Z": -491.209 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 1833, + "MinimumKillCount": 2 + } + ], + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json index b100ce645..45fa6cebb 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1366_Glutton for Punishment.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,92 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 112.19494, + "Y": 23.602901, + "Z": -611.7208 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "Position": { + "X": 13.632976, + "Y": 21.54334, + "Z": -769.12134 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 2003699, + "Position": { + "X": 7.94989, + "Y": 21.713562, + "Z": -769.06995 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "KillEnemyDataIds": [ + 2841 + ], + "ItemId": 2001230, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2003701, + "Position": { + "X": 5.142273, + "Y": 23.75824, + "Z": -803.9216 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "KillEnemyDataIds": [ + 2841 + ], + "ItemId": 2001230, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + }, + { + "DataId": 2003702, + "Position": { + "X": 0.47296143, + "Y": 24.551636, + "Z": -795.74274 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "KillEnemyDataIds": [ + 2841 + ], + "ItemId": 2001230 + } + ] + }, { "Sequence": 255, "Steps": [ @@ -30,6 +115,7 @@ }, "TerritoryId": 180, "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", "Fly": true } ] From 0eca81e4749b5df762ee8d16bd5e1ab977ec7763 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 16:19:44 +0100 Subject: [PATCH 028/109] Add some moogle dailies --- .../Moogles/Dailies/2311_Ship of Dreams.json | 83 +++++++++++++- .../Moogles/Dailies/2317_Mine and Craft.json | 38 +++++- .../Dailies/2318_The Moogle Motivator.json | 108 +++++++++++++++++- .../Dailies/2319_Tremble Finishing.json | 50 +++++++- 4 files changed, 275 insertions(+), 4 deletions(-) diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2311_Ship of Dreams.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2311_Ship of Dreams.json index 1a867f707..2e9078a67 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2311_Ship of Dreams.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2311_Ship of Dreams.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,88 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017422, + "Position": { + "X": -8.804504, + "Y": 81.8406, + "Z": -312.00128 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1017424, + "Position": { + "X": 7.4310913, + "Y": 81.84059, + "Z": -321.1872 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1017422, + "Position": { + "X": -8.804504, + "Y": 81.8406, + "Z": -312.00128 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15740, + "ItemCount": 3 + }, + { + "DataId": 1017424, + "Position": { + "X": 7.4310913, + "Y": 81.84059, + "Z": -321.1872 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1017422, + "Position": { + "X": -8.804504, + "Y": 81.8406, + "Z": -312.00128 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2317_Mine and Craft.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2317_Mine and Craft.json index 1a867f707..4d2f05e6d 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2317_Mine and Craft.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2317_Mine and Craft.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,43 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017465, + "Position": { + "X": 202.28882, + "Y": 42.309406, + "Z": -577.3861 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15744, + "ItemCount": 2 + }, + { + "DataId": 1017466, + "Position": { + "X": 176.71472, + "Y": 42.308628, + "Z": -571.37415 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2318_The Moogle Motivator.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2318_The Moogle Motivator.json index 1a867f707..5217e3e48 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2318_The Moogle Motivator.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2318_The Moogle Motivator.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,113 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017351, + "Position": { + "X": -74.87604, + "Y": -8.172172, + "Z": 158.70898 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1017467, + "Position": { + "X": -40.20758, + "Y": -8.6555605, + "Z": 202.83813 + }, + "StopDistance": 0.5, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1017624, + "Position": { + "X": -76.0968, + "Y": -8.655561, + "Z": 216.17456 + }, + "TerritoryId": 400, + "InteractionType": "Emote", + "Emote": "psych", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1017625, + "Position": { + "X": -46.76892, + "Y": 10.765197, + "Z": 243.12195 + }, + "StopDistance": 0.5, + "TerritoryId": 400, + "InteractionType": "Emote", + "Emote": "slap", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1017351, + "Position": { + "X": -74.87604, + "Y": -8.172172, + "Z": 158.70898 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15745, + "ItemCount": 1 + }, + { + "DataId": 1017625, + "Position": { + "X": -46.76892, + "Y": 10.765197, + "Z": 243.12195 + }, + "StopDistance": 0.5, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2319_Tremble Finishing.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2319_Tremble Finishing.json index 1a867f707..f951ed6ea 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2319_Tremble Finishing.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2319_Tremble Finishing.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,55 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017470, + "Position": { + "X": -353.53632, + "Y": 60.896175, + "Z": 299.61084 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007283, + "Position": { + "X": -177.87445, + "Y": 53.055542, + "Z": 53.665894 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007284, + "Position": { + "X": -320.60736, + "Y": 220.38599, + "Z": -708.00336 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ From 3b7032bff6cf29192cfecb12c842c0baea72f77b Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 16:54:47 +0100 Subject: [PATCH 029/109] Add SB SMN quests --- .../SMN/2625_A Book with Bite.json | 123 +++++++++++++++ .../SMN/2626_Performing for Prin.json | 144 +++++++++++++++++ .../SMN/2627_An Egi-stential Crisis.json | 110 +++++++++++++ .../Class Quests/SMN/2628_Off the Record.json | 149 ++++++++++++++++++ .../SMN/2629_An Art for the Living.json | 138 ++++++++++++++++ 5 files changed, 664 insertions(+) create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SMN/2625_A Book with Bite.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SMN/2626_Performing for Prin.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SMN/2627_An Egi-stential Crisis.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SMN/2628_Off the Record.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/SMN/2629_An Art for the Living.json diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SMN/2625_A Book with Bite.json b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2625_A Book with Bite.json new file mode 100644 index 000000000..c5ad956da --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2625_A Book with Bite.json @@ -0,0 +1,123 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006725, + "Position": { + "X": 446.82983, + "Y": -5.306207, + "Z": -465.72064 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "AetheryteShortcut": "Mor Dhona", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022761, + "Position": { + "X": 5.996765, + "Y": 20.712559, + "Z": -659.26605 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "AetheryteShortcut": "Mor Dhona" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1022762, + "Position": { + "X": 385.39697, + "Y": 23.711746, + "Z": -712.7031 + }, + "TerritoryId": 156, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7227 + ], + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1022763, + "Position": { + "X": 384.0542, + "Y": 23.602556, + "Z": -711.20776 + }, + "TerritoryId": 156, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "NextQuestId": 2626 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SMN/2626_Performing for Prin.json b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2626_Performing for Prin.json new file mode 100644 index 000000000..b72821524 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2626_Performing for Prin.json @@ -0,0 +1,144 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022765, + "Position": { + "X": 49.66809, + "Y": 3.9999626, + "Z": 429.22095 + }, + "TerritoryId": 147, + "InteractionType": "Interact", + "AetheryteShortcut": "Northern Thanalan - Camp Bluefog" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022770, + "Position": { + "X": 82.38342, + "Y": 14.362329, + "Z": 221.20996 + }, + "TerritoryId": 147, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7228 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1022772, + "Position": { + "X": 87.907104, + "Y": 14.713098, + "Z": 222.03394 + }, + "TerritoryId": 147, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7229 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1022772, + "Position": { + "X": 87.907104, + "Y": 14.713098, + "Z": 222.03394 + }, + "TerritoryId": 147, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 7230 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1022773, + "Position": { + "X": 74.66235, + "Y": 14.033362, + "Z": 228.5343 + }, + "TerritoryId": 147, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "NextQuestId": 2627 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SMN/2627_An Egi-stential Crisis.json b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2627_An Egi-stential Crisis.json new file mode 100644 index 000000000..6cc694794 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2627_An Egi-stential Crisis.json @@ -0,0 +1,110 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014039, + "Position": { + "X": -17.990417, + "Y": 83.19999, + "Z": 0.6560669 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Airship Landing" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1014038, + "Position": { + "X": -20.24878, + "Y": 83.19998, + "Z": -1.4801636 + }, + "StopDistance": 7, + "TerritoryId": 130, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 3 + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1014040, + "Position": { + "X": -19.028076, + "Y": 83.19999, + "Z": 0.10675049 + }, + "StopDistance": 7, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "NextQuestId": 2628 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SMN/2628_Off the Record.json b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2628_Off the Record.json new file mode 100644 index 000000000..9d5313fb4 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2628_Off the Record.json @@ -0,0 +1,149 @@ + +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006725, + "Position": { + "X": 446.82983, + "Y": -5.306207, + "Z": -465.72064 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "AetheryteShortcut": "Mor Dhona", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 26.405773, + "Y": 29.49983, + "Z": -767.3998 + }, + "TerritoryId": 156, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Mor Dhona", + "Fly": true + }, + { + "Position": { + "X": 25.629164, + "Y": 28.999998, + "Z": -823.2204 + }, + "TerritoryId": 156, + "InteractionType": "WalkTo" + }, + { + "DataId": 1001304, + "Position": { + "X": 25.589355, + "Y": 29, + "Z": -825.37573 + }, + "TerritoryId": 156, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 26.405773, + "Y": 29.49983, + "Z": -767.3998 + }, + "TerritoryId": 156, + "InteractionType": "WalkTo" + }, + { + "DataId": 1023894, + "Position": { + "X": 8.346619, + "Y": 20.717896, + "Z": -657.49603 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1022780, + "Position": { + "X": 412.5581, + "Y": -5.7435417, + "Z": -436.39276 + }, + "TerritoryId": 156, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "NextQuestId": 2629 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/SMN/2629_An Art for the Living.json b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2629_An Art for the Living.json new file mode 100644 index 000000000..0cf770887 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/SMN/2629_An Art for the Living.json @@ -0,0 +1,138 @@ + +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022785, + "Position": { + "X": -624.6891, + "Y": -176.4502, + "Z": -565.0874 + }, + "TerritoryId": 402, + "InteractionType": "Interact", + "AetheryteShortcut": "Azys Lla - Helix", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 20.176798, + "Y": 293.97687, + "Z": -0.15623161 + }, + "StopDistance": 0.5, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7231 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008640, + "Position": { + "X": 16.617004, + "Y": 293.8734, + "Z": 0.07623291 + }, + "TerritoryId": 402, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1023595, + "Position": { + "X": 21.98816, + "Y": 293.97577, + "Z": 0.41192627 + }, + "TerritoryId": 402, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1022790, + "Position": { + "X": 21.957703, + "Y": 293.9787, + "Z": -1.0529175 + }, + "StopDistance": 5, + "TerritoryId": 402, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006756, + "Position": { + "X": -16.891846, + "Y": 10.17425, + "Z": -246.87573 + }, + "TerritoryId": 133, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ] + } + ] + } + ] +} From 7bcbceb51e3ea190e49c345d414de3bb97b2edff Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 17:34:28 +0100 Subject: [PATCH 030/109] Add 1-50 BLU quests --- .../BLU/3192_Out of the Blue.json | 111 +++++++++++++++ .../BLU/3193_Blue Leading the Blue.json | 99 +++++++++++++ .../BLU/3194_Blue Collar Work.json | 113 +++++++++++++++ .../BLU/3195_Why They Call It the Blues.json | 110 +++++++++++++++ .../BLU/3196_Scream Blue Murder.json | 130 ++++++++++++++++++ .../Class Quests/BLU/3197_Blue Gold.json | 98 +++++++++++++ .../BLU/3198_The Real Folk Blues.json | 87 ++++++++++++ .../BLU/3199_Turning Over a Blue Leaf.json | 52 +++++++ QuestPaths/quest-v1.json | 3 +- .../Questing/Converter/ActionConverter.cs | 1 + Questionable.Model/Questing/EAction.cs | 1 + Questionable/Data/QuestData.cs | 2 +- 12 files changed, 805 insertions(+), 2 deletions(-) create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3192_Out of the Blue.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3193_Blue Leading the Blue.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3194_Blue Collar Work.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3195_Why They Call It the Blues.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3196_Scream Blue Murder.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3197_Blue Gold.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3198_The Real Folk Blues.json create mode 100644 QuestPaths/4.x - Stormblood/Class Quests/BLU/3199_Turning Over a Blue Leaf.json diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3192_Out of the Blue.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3192_Out of the Blue.json new file mode 100644 index 000000000..d39707cee --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3192_Out of the Blue.json @@ -0,0 +1,111 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026928, + "Position": { + "X": -64.34735, + "Y": 18.000334, + "Z": -11.032288 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026929, + "Position": { + "X": -69.87109, + "Y": 43.83883, + "Z": -5.661133 + }, + "TerritoryId": 134, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1026936, + "Position": { + "X": 170.85522, + "Y": 62.765503, + "Z": 275.25745 + }, + "TerritoryId": 134, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1028430, + "Position": { + "X": 156.63379, + "Y": 12.126303, + "Z": 649.37805 + }, + "TerritoryId": 135, + "InteractionType": "Interact", + "AetheryteShortcut": "Lower La Noscea - Moraby Drydocks" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1026930, + "Position": { + "X": -85.404785, + "Y": 2.5427969, + "Z": 728.542 + }, + "TerritoryId": 135, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026932, + "Position": { + "X": -105.9129, + "Y": 1.5723714, + "Z": 750.0571 + }, + "StopDistance": 7, + "TerritoryId": 135, + "InteractionType": "CompleteQuest", + "NextQuestId": 3193 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3193_Blue Leading the Blue.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3193_Blue Leading the Blue.json new file mode 100644 index 000000000..fdf1434c5 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3193_Blue Leading the Blue.json @@ -0,0 +1,99 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "TerritoryId": 135, + "InteractionType": "EquipItem", + "ItemId": 22746, + "AetheryteShortcut": "Lower La Noscea - Moraby Drydocks", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + }, + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 135, + "InteractionType": "EquipItem", + "ItemId": 24587, + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 135, + "InteractionType": "EquipRecommended" + }, + { + "DataId": 1026932, + "Position": { + "X": -105.9129, + "Y": 1.5723714, + "Z": 750.0571 + }, + "StopDistance": 7, + "TerritoryId": 135, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026934, + "Position": { + "X": -108.04913, + "Y": 1.5026048, + "Z": 749.1415 + }, + "TerritoryId": 135, + "InteractionType": "Action", + "Action": "Water Cannon" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026937, + "Position": { + "X": 65.7511, + "Y": 14.005002, + "Z": 90.440186 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_JOBAOZ010_03193_Q1_100_002", + "Yes": true + } + ], + "NextQuestId": 3194 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3194_Blue Collar Work.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3194_Blue Collar Work.json new file mode 100644 index 000000000..27d9a9f8b --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3194_Blue Collar Work.json @@ -0,0 +1,113 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026938, + "Position": { + "X": 101.27405, + "Y": 7.3536396, + "Z": 600.2135 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Gate of Thal (Central Thanalan)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2009670, + "Position": { + "X": 163.59192, + "Y": 3.7078857, + "Z": 657.0991 + }, + "StopDistance": 0.5, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 9836 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1026938, + "Position": { + "X": 101.27405, + "Y": 7.3536396, + "Z": 600.2135 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 3195 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3195_Why They Call It the Blues.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3195_Why They Call It the Blues.json new file mode 100644 index 000000000..525e908ee --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3195_Why They Call It the Blues.json @@ -0,0 +1,110 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026941, + "Position": { + "X": 105.02783, + "Y": 4.0333576, + "Z": 451.0719 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Gate of Thal (Central Thanalan)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2009671, + "Position": { + "X": 145.52527, + "Y": 9.567322, + "Z": 391.10388 + }, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 9837 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1026941, + "Position": { + "X": 105.02783, + "Y": 4.0333576, + "Z": 451.0719 + }, + "TerritoryId": 141, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 3196 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3196_Scream Blue Murder.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3196_Scream Blue Murder.json new file mode 100644 index 000000000..62fad7d66 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3196_Scream Blue Murder.json @@ -0,0 +1,130 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026945, + "Position": { + "X": -108.415405, + "Y": 41, + "Z": 76.06616 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Alchemists' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1026946, + "Position": { + "X": 392.69092, + "Y": 87.19347, + "Z": 98.10022 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Alchemists' Guild", + "[Ul'dah] Gate of the Sultana (Western Thanalan)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 363.6008, + "Y": 83.40785, + "Z": 92.904495 + }, + "StopDistance": 0.5, + "TerritoryId": 140, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 9838, + 9839 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1026948, + "Position": { + "X": 359.63977, + "Y": 83.013695, + "Z": 92.24072 + }, + "StopDistance": 5, + "TerritoryId": 140, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 3197 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3197_Blue Gold.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3197_Blue Gold.json new file mode 100644 index 000000000..ab9cd8ae2 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3197_Blue Gold.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026924, + "Position": { + "X": 64.46936, + "Y": 14.005002, + "Z": 88.70068 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026951, + "Position": { + "X": 196.67346, + "Y": 52.774567, + "Z": -38.895264 + }, + "TerritoryId": 140, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 9840 + ], + "AetheryteShortcut": "Western Thanalan - Horizon", + "Fly": true, + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_JOBAOZ400_03197_Q1_000_013", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1026951, + "Position": { + "X": 196.67346, + "Y": 52.774567, + "Z": -38.895264 + }, + "TerritoryId": 140, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026953, + "Position": { + "X": 65.59851, + "Y": 14.005001, + "Z": 91.75244 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 3198 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3198_The Real Folk Blues.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3198_The Real Folk Blues.json new file mode 100644 index 000000000..be76c4697 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3198_The Real Folk Blues.json @@ -0,0 +1,87 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026924, + "Position": { + "X": 64.46936, + "Y": 14.005002, + "Z": 88.70068 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026955, + "Position": { + "X": -10.055725, + "Y": 47, + "Z": -29.800903 + }, + "TerritoryId": 147, + "InteractionType": "Interact", + "AetheryteShortcut": "Northern Thanalan - Ceruleum Processing Plant" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1026937, + "Position": { + "X": 65.7511, + "Y": 14.005002, + "Z": 90.440186 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026937, + "Position": { + "X": 65.7511, + "Y": 14.005002, + "Z": 90.440186 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 3199 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BLU/3199_Turning Over a Blue Leaf.json b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3199_Turning Over a Blue Leaf.json new file mode 100644 index 000000000..85121f2db --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Class Quests/BLU/3199_Turning Over a Blue Leaf.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026924, + "Position": { + "X": 64.46936, + "Y": 14.005002, + "Z": 88.70068 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 3732 + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 247628f85..cb035ef71 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -982,7 +982,8 @@ "Bosom Brook", "Souleater", "Fire III", - "Adloquium" + "Adloquium", + "Water Cannon" ] } }, diff --git a/Questionable.Model/Questing/Converter/ActionConverter.cs b/Questionable.Model/Questing/Converter/ActionConverter.cs index 0f72c7317..27436b935 100644 --- a/Questionable.Model/Questing/Converter/ActionConverter.cs +++ b/Questionable.Model/Questing/Converter/ActionConverter.cs @@ -47,5 +47,6 @@ public sealed class ActionConverter() : EnumConverter(Values) { EAction.Souleater, "Souleater" }, { EAction.Fire3, "Fire III" }, { EAction.Adloquium, "Adloquium" }, + { EAction.WaterCannon, "Water Cannon" }, }; } diff --git a/Questionable.Model/Questing/EAction.cs b/Questionable.Model/Questing/EAction.cs index 3a4981af6..159c2f7e9 100644 --- a/Questionable.Model/Questing/EAction.cs +++ b/Questionable.Model/Questing/EAction.cs @@ -53,6 +53,7 @@ public enum EAction Souleater = 3632, Fire3 = 152, Adloquium = 185, + WaterCannon = 11385, CollectMiner = 240, ScourMiner = 22182, diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index 7e07f2f92..8f51c4991 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -310,7 +310,7 @@ internal sealed class QuestData // SB EClassJob.Samurai => [110, 111], EClassJob.RedMage => [131, 132], - EClassJob.BlueMage => [134, 135, 146], + EClassJob.BlueMage => [134, 135, 146, 170], // ShB EClassJob.Gunbreaker => [84], From 2d11a9b7d1af61c8cc23c35941fd014ac9942c57 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 17:51:02 +0100 Subject: [PATCH 031/109] Add 50-60 BLU quests --- .../BLU/3732_Into the Blue Again.json | 82 +++++++++++ ...33_Something Borrowed, Something Blue.json | 109 +++++++++++++++ .../BLU/3734_Bolt from the Blue.json | 126 +++++++++++++++++ .../BLU/3735_Blue in the Face.json | 123 +++++++++++++++++ .../BLU/3736_Blue Scream of Death.json | 129 ++++++++++++++++++ .../Class Quests/BLU/3737_Blue Cheese.json | 52 +++++++ 6 files changed, 621 insertions(+) create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3732_Into the Blue Again.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3733_Something Borrowed, Something Blue.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3734_Bolt from the Blue.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3735_Blue in the Face.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3736_Blue Scream of Death.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3737_Blue Cheese.json diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3732_Into the Blue Again.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3732_Into the Blue Again.json new file mode 100644 index 000000000..f8d585a13 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3732_Into the Blue Again.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1031957, + "Position": { + "X": 16.433899, + "Y": 10, + "Z": 152.97156 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 3733 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3733_Something Borrowed, Something Blue.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3733_Something Borrowed, Something Blue.json new file mode 100644 index 000000000..332b67fd2 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3733_Something Borrowed, Something Blue.json @@ -0,0 +1,109 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1031958, + "Position": { + "X": 178.0575, + "Y": 51.459526, + "Z": 104.69214 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Gate of the Sultana (Western Thanalan)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1031958, + "Position": { + "X": 178.0575, + "Y": 51.459526, + "Z": 104.69214 + }, + "TerritoryId": 140, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 11441 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1031958, + "Position": { + "X": 178.0575, + "Y": 51.459526, + "Z": 104.69214 + }, + "TerritoryId": 140, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 3734 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3734_Bolt from the Blue.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3734_Bolt from the Blue.json new file mode 100644 index 000000000..8aeb0b0cb --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3734_Bolt from the Blue.json @@ -0,0 +1,126 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1031962, + "Position": { + "X": -25.558899, + "Y": 14, + "Z": 84.51965 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Goldsmiths' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1031965, + "Position": { + "X": -193.3471, + "Y": 18, + "Z": 88.181885 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Goldsmiths' Guild", + "[Ul'dah] Thaumaturges' Guild" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1031968, + "Position": { + "X": 34.286987, + "Y": 7.9999285, + "Z": -113.78656 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Thaumaturges' Guild", + "[Ul'dah] Adventurers' Guild" + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Adventurers' Guild", + "[Ul'dah] Weavers' Guild" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 3735 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3735_Blue in the Face.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3735_Blue in the Face.json new file mode 100644 index 000000000..e28cdb77c --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3735_Blue in the Face.json @@ -0,0 +1,123 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1032158, + "Position": { + "X": 74.23511, + "Y": 45, + "Z": -204.27258 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "AetheryteShortcut": "Western Thanalan - Horizon" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1031971, + "Position": { + "X": 298.146, + "Y": 62.280518, + "Z": -209.0639 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2010849, + "Position": { + "X": 192.55359, + "Y": 55.039307, + "Z": -190.81409 + }, + "TerritoryId": 140, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 11442 + ], + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1031971, + "Position": { + "X": 298.146, + "Y": 62.280518, + "Z": -209.0639 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 3736 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3736_Blue Scream of Death.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3736_Blue Scream of Death.json new file mode 100644 index 000000000..4c408e8ad --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3736_Blue Scream of Death.json @@ -0,0 +1,129 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1031980, + "Position": { + "X": -85.00806, + "Y": 6.9845695, + "Z": -11.001831 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Gladiators' Guild" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1031979, + "Position": { + "X": -92.5155, + "Y": 6.9845695, + "Z": -17.07489 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1001675, + "Position": { + "X": -89.49426, + "Y": 7.008118, + "Z": 10.849121 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1031978, + "Position": { + "X": -75.05914, + "Y": 6.9845705, + "Z": 10.971252 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 3737 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3737_Blue Cheese.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3737_Blue Cheese.json new file mode 100644 index 000000000..316a67926 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3737_Blue Cheese.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 3989 + } + ] + } + ] +} From 782d6b82af8d9fab6e84e343a005cddd1da77b53 Mon Sep 17 00:00:00 2001 From: Taurenkey Date: Thu, 26 Dec 2024 17:04:08 +0000 Subject: [PATCH 032/109] Hide quest filters added --- Questionable/Data/JournalData.cs | 48 ++++++++++------- Questionable/Functions/QuestFunctions.cs | 3 ++ .../QuestJournalComponent.cs | 52 ++++++++++++++----- .../JournalComponents/QuestJournalUtils.cs | 23 +++++++- 4 files changed, 94 insertions(+), 32 deletions(-) diff --git a/Questionable/Data/JournalData.cs b/Questionable/Data/JournalData.cs index 115d806e2..52f37e22e 100644 --- a/Questionable/Data/JournalData.cs +++ b/Questionable/Data/JournalData.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Linq; using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.Game.Fate; using Lumina.Excel.Sheets; using Questionable.Model; using Questionable.Model.Questing; @@ -9,30 +10,44 @@ namespace Questionable.Data; internal sealed class JournalData { + private readonly IDataManager _dataManager; + private readonly QuestData _questData; public JournalData(IDataManager dataManager, QuestData questData) { - var genres = dataManager.GetExcelSheet() - .Where(x => x.RowId > 0 && x.Icon > 0) - .Select(x => new Genre(x, questData.GetAllByJournalGenre(x.RowId))) - .ToList(); + _dataManager = dataManager; + _questData = questData; - var limsaStart = dataManager.GetExcelSheet().GetRow(1); - var gridaniaStart = dataManager.GetExcelSheet().GetRow(2); - var uldahStart = dataManager.GetExcelSheet().GetRow(3); + Reload(); + } + + public List Genres { get; set; } + public List Categories { get; set; } + public List
Sections { get; set; } + + public void Reload() + { + var genres = _dataManager.GetExcelSheet() + .Where(x => x.RowId > 0 && x.Icon > 0) + .Select(x => new Genre(x, _questData.GetAllByJournalGenre(x.RowId))) + .ToList(); + + var limsaStart = _dataManager.GetExcelSheet().GetRow(1); + var gridaniaStart = _dataManager.GetExcelSheet().GetRow(2); + var uldahStart = _dataManager.GetExcelSheet().GetRow(3); var genreLimsa = new Genre(uint.MaxValue - 3, "Starting in Limsa Lominsa", 1, new uint[] { 108, 109 }.Concat(limsaStart.QuestRedoParam.Select(x => x.Quest.RowId)) .Where(x => x != 0) - .Select(x => 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.QuestRedoParam.Select(x => x.Quest.RowId)) .Where(x => x != 0) - .Select(x => 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.QuestRedoParam.Select(x => x.Quest.RowId)) .Where(x => x != 0) - .Select(x => 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) @@ -40,21 +55,16 @@ internal sealed class JournalData .RemoveAll(x => genreLimsa.Quests.Contains(x) || genreGridania.Quests.Contains(x) || genreUldah.Quests.Contains(x)); - Genres = genres.AsReadOnly(); - Categories = dataManager.GetExcelSheet() + Genres = genres.ToList(); + Categories = _dataManager.GetExcelSheet() .Where(x => x.RowId > 0) .Select(x => new Category(x, Genres.Where(y => y.CategoryId == x.RowId).ToList())) - .ToList() - .AsReadOnly(); - Sections = dataManager.GetExcelSheet() + .ToList(); + Sections = _dataManager.GetExcelSheet() .Select(x => new Section(x, Categories.Where(y => y.SectionId == x.RowId).ToList())) .ToList(); } - public IReadOnlyList Genres { get; } - public IReadOnlyList Categories { get; } - public List
Sections { get; set; } - internal sealed class Genre { public Genre(JournalGenre journalGenre, List quests) diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index 8c937bcc9..cc38e8745 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -455,6 +455,9 @@ internal sealed unsafe class QuestFunctions if (QuestManager.Instance()->IsDailyQuestCompleted(questId.Value)) return false; } + + if (IsQuestComplete(questId)) + return false; } else { diff --git a/Questionable/Windows/JournalComponents/QuestJournalComponent.cs b/Questionable/Windows/JournalComponents/QuestJournalComponent.cs index 04dc9bca8..de5a7bb88 100644 --- a/Questionable/Windows/JournalComponents/QuestJournalComponent.cs +++ b/Questionable/Windows/JournalComponents/QuestJournalComponent.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using Dalamud.Interface; +using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility.Raii; using Dalamud.Plugin; @@ -12,9 +8,12 @@ using Questionable.Controller; using Questionable.Data; using Questionable.Functions; using Questionable.Model; -using Questionable.Model.Questing; using Questionable.Validation; using Questionable.Windows.QuestComponents; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; namespace Questionable.Windows.JournalComponents; @@ -32,13 +31,14 @@ internal sealed class QuestJournalComponent private readonly IDalamudPluginInterface _pluginInterface; private readonly QuestJournalUtils _questJournalUtils; private readonly QuestValidator _questValidator; + private readonly IPluginLog _log; private List _filteredSections = []; private string _searchText = string.Empty; public QuestJournalComponent(JournalData journalData, QuestRegistry questRegistry, QuestFunctions questFunctions, UiUtils uiUtils, QuestTooltipComponent questTooltipComponent, IDalamudPluginInterface pluginInterface, - QuestJournalUtils questJournalUtils, QuestValidator questValidator) + QuestJournalUtils questJournalUtils, QuestValidator questValidator, IPluginLog log) { _journalData = journalData; _questRegistry = questRegistry; @@ -48,6 +48,7 @@ internal sealed class QuestJournalComponent _pluginInterface = pluginInterface; _questJournalUtils = questJournalUtils; _questValidator = questValidator; + _log = log; } public void DrawQuests() @@ -69,6 +70,9 @@ internal sealed class QuestJournalComponent ImGui.Spacing(); } + QuestJournalUtils.ShowFilterContextMenu(this); + + ImGui.SameLine(); ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X); if (ImGui.InputTextWithHint(string.Empty, "Search quests and categories", ref _searchText, 256)) UpdateFilter(); @@ -235,17 +239,41 @@ internal sealed class QuestJournalComponent public void UpdateFilter() { - Predicate match; - if (string.IsNullOrWhiteSpace(_searchText)) - match = _ => true; - else - match = x => x.Contains(_searchText, StringComparison.CurrentCultureIgnoreCase); + _journalData.Reload(); + Predicate match = string.IsNullOrWhiteSpace(_searchText) ? x => true : x => x.Contains(_searchText, StringComparison.CurrentCultureIgnoreCase); _filteredSections = _journalData.Sections .Select(section => FilterSection(section, match)) .Where(x => x != null) .Cast() .ToList(); + + for (int i = 0; i < _filteredSections.Count; i++) + { + var section = _filteredSections[i]; + for (int s = 0; s < section.Categories.Count; s++) + { + var category = section.Categories[s]; + for (int c = 0; c < category.Genres.Count; c++) + { + var genre = category.Genres[c]; + for (int g = 0; g < genre.Quests.Count; g++) + { + var quest = genre.Quests[g]; + + //All Quest Filter conditions checked here, cause we just love IEnumerable + if (QuestJournalUtils.AvailableOnly && !_questFunctions.IsReadyToAcceptQuest(quest.QuestId) || + QuestJournalUtils.HideNoPaths && !_questRegistry.TryGetQuest(quest.QuestId, out _)) + { + genre.Quests.Remove(quest); + g--; + } + } + } + } + } + + RefreshCounts(); } private static FilteredSection? FilterSection(JournalData.Section section, Predicate match) diff --git a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs index 40f59278a..8d43d7f75 100644 --- a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs +++ b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs @@ -1,10 +1,12 @@ -using Dalamud.Interface.Utility.Raii; +using Dalamud.Interface.Components; +using Dalamud.Interface.Utility.Raii; using Dalamud.Plugin.Services; using ImGuiNET; using Questionable.Controller; using Questionable.Functions; using Questionable.Model; using Questionable.Model.Questing; +using System; namespace Questionable.Windows.JournalComponents; @@ -14,6 +16,9 @@ internal sealed class QuestJournalUtils private readonly QuestFunctions _questFunctions; private readonly ICommandManager _commandManager; + public static bool AvailableOnly; + public static bool HideNoPaths; + public QuestJournalUtils(QuestController questController, QuestFunctions questFunctions, ICommandManager commandManager) { @@ -44,4 +49,20 @@ internal sealed class QuestJournalUtils commandInfo!); } } + + internal static void ShowFilterContextMenu(QuestJournalComponent journalUI) + { + if (ImGuiComponents.IconButton(Dalamud.Interface.FontAwesomeIcon.Filter)) + ImGui.OpenPopup($"##QuestFilters"); + + using var popup = ImRaii.Popup($"##QuestFilters"); + if (!popup) + return; + + if (ImGui.Checkbox("Show only Available Quests", ref AvailableOnly) || + ImGui.Checkbox("Hide Quests Without Path", ref HideNoPaths)) + journalUI.UpdateFilter(); + + + } } From 0b6e2626aac64e38d14d9c8659ed3839526bd345 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 21:49:11 +0100 Subject: [PATCH 033/109] Add 60-70 BLU quests --- .../BLU/3989_Second-rate Entertainment.json | 77 ++++++ .../3990_Everybody Was Fukumen Fighting.json | 219 ++++++++++++++++++ .../BLU/3991_Azuro and Goliath.json | 163 +++++++++++++ .../BLU/3992_Where the Gold Goes.json | 184 +++++++++++++++ .../BLU/3993_Master of Mimicry.json | 82 +++++++ .../BLU/3994_A Future in Blue.json | 52 +++++ 6 files changed, 777 insertions(+) create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3989_Second-rate Entertainment.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3990_Everybody Was Fukumen Fighting.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3991_Azuro and Goliath.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3992_Where the Gold Goes.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3993_Master of Mimicry.json create mode 100644 QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3994_A Future in Blue.json diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3989_Second-rate Entertainment.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3989_Second-rate Entertainment.json new file mode 100644 index 000000000..7303bf91f --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3989_Second-rate Entertainment.json @@ -0,0 +1,77 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1035094, + "Position": { + "X": 101.21301, + "Y": 9.738088, + "Z": 630.88416 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Gate of Thal (Central Thanalan)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 3990 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3990_Everybody Was Fukumen Fighting.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3990_Everybody Was Fukumen Fighting.json new file mode 100644 index 000000000..d248e1ffc --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3990_Everybody Was Fukumen Fighting.json @@ -0,0 +1,219 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1035095, + "Position": { + "X": 63.004395, + "Y": 14.005002, + "Z": 89.829834 + }, + "StopDistance": 7, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBAOZ630_03990_Q1_000_000", + "Answer": "TEXT_JOBAOZ630_03990_A1_000_002" + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019038, + "Position": { + "X": -55.222473, + "Y": -2.9000003, + "Z": -65.65961 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] Shiokaze Hostelry" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1019069, + "Position": { + "X": -62.119568, + "Y": 8, + "Z": -56.62628 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1035099, + "Position": { + "X": -36.728516, + "Y": 14.000002, + "Z": -52.170654 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1035103, + "Position": { + "X": 56.77881, + "Y": 4.05, + "Z": 92.36279 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] Kogane Dori Markets" + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1035104, + "Position": { + "X": 153.42944, + "Y": 18.1, + "Z": 50.70569 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Kogane Dori Markets", + "[Kugane] The Ruby Bazaar" + ] + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1035097, + "Position": { + "X": 151.87305, + "Y": 18.1, + "Z": 49.484985 + }, + "StopDistance": 5, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Sekiseigumi Barracks" + ], + "NextQuestId": 3991 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3991_Azuro and Goliath.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3991_Azuro and Goliath.json new file mode 100644 index 000000000..18b13d554 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3991_Azuro and Goliath.json @@ -0,0 +1,163 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_JOBAOZ650_03991_Q1_000_000", + "Answer": "TEXT_JOBAOZ650_03991_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1035103, + "Position": { + "X": 56.77881, + "Y": 4.05, + "Z": 92.36279 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] Kogane Dori Markets" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1018989, + "Position": { + "X": 35.171997, + "Y": 4.8365545, + "Z": 49.240845 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1018990, + "Position": { + "X": 40.024292, + "Y": 4.83654, + "Z": 49.05774 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1035106, + "Position": { + "X": 83.08533, + "Y": 4.0000014, + "Z": 51.621216 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1035107, + "Position": { + "X": 139.0249, + "Y": 18, + "Z": 48.508423 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1035105, + "Position": { + "X": 139.0249, + "Y": 18, + "Z": 48.508423 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Sekiseigumi Barracks" + ], + "NextQuestId": 3992 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3992_Where the Gold Goes.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3992_Where the Gold Goes.json new file mode 100644 index 000000000..ff15582ae --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3992_Where the Gold Goes.json @@ -0,0 +1,184 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1035107, + "Position": { + "X": 139.0249, + "Y": 18, + "Z": 48.508423 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] The Ruby Bazaar" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1035108, + "Position": { + "X": -106.401184, + "Y": -7, + "Z": -63.553833 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] The Ruby Bazaar", + "[Kugane] Shiokaze Hostelry" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1035109, + "Position": { + "X": 449.27136, + "Y": 58.40733, + "Z": -149.82837 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "AetheryteShortcut": "Yanxia - Namai", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1035112, + "Position": { + "X": 457.32812, + "Y": 67.99535, + "Z": -108.20172 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1019257, + "Position": { + "X": 468.55872, + "Y": 68.02771, + "Z": -93.21747 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1035113, + "Position": { + "X": 404.77612, + "Y": 72.81784, + "Z": -80.338745 + }, + "StopDistance": 1, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1035114, + "Position": { + "X": 382.62, + "Y": 85.20213, + "Z": -184.0086 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "NextQuestId": 3993 + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3993_Master of Mimicry.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3993_Master of Mimicry.json new file mode 100644 index 000000000..be9d4e0c2 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3993_Master of Mimicry.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1035096, + "Position": { + "X": 130.84607, + "Y": 11.999016, + "Z": -82.108826 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1035116, + "Position": { + "X": 153.39893, + "Y": 18.1, + "Z": 50.70569 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] The Ruby Bazaar" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1026937, + "Position": { + "X": 65.7511, + "Y": 14.005002, + "Z": 90.440186 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026937, + "Position": { + "X": 65.7511, + "Y": 14.005002, + "Z": 90.440186 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3994_A Future in Blue.json b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3994_A Future in Blue.json new file mode 100644 index 000000000..b7068d41e --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/BLU/3994_A Future in Blue.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 4773 + } + ] + } + ] +} From 03681b8253e4227adc50a71eb365ff4c2ea0adc3 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 22:19:54 +0100 Subject: [PATCH 034/109] Add 73-80 BLU quests --- .../6.x - Endwalker/Class Quests/BLU/4773.txt | 1 + .../4774_The Beard, the Myth, the Legend.json | 209 ++++++++++++++++++ .../BLU/4775_Gridania's Most Wanted.json | 119 ++++++++++ .../BLU/4776_No Butts About It.json | 202 +++++++++++++++++ .../BLU/4777_A New Gold Standard.json | 70 ++++++ .../BLU/4778_The Brave and the Blue.json | 50 +++++ 6 files changed, 651 insertions(+) create mode 100644 QuestPaths/6.x - Endwalker/Class Quests/BLU/4773.txt create mode 100644 QuestPaths/6.x - Endwalker/Class Quests/BLU/4774_The Beard, the Myth, the Legend.json create mode 100644 QuestPaths/6.x - Endwalker/Class Quests/BLU/4775_Gridania's Most Wanted.json create mode 100644 QuestPaths/6.x - Endwalker/Class Quests/BLU/4776_No Butts About It.json create mode 100644 QuestPaths/6.x - Endwalker/Class Quests/BLU/4777_A New Gold Standard.json create mode 100644 QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json diff --git a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4773.txt b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4773.txt new file mode 100644 index 000000000..1e9793d1b --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4773.txt @@ -0,0 +1 @@ +stopdistance: 5 diff --git a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4774_The Beard, the Myth, the Legend.json b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4774_The Beard, the Myth, the Legend.json new file mode 100644 index 000000000..6a469a21b --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4774_The Beard, the Myth, the Legend.json @@ -0,0 +1,209 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1035095, + "Position": { + "X": 63.004395, + "Y": 14.005002, + "Z": 89.829834 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1045582, + "Position": { + "X": -344.53345, + "Y": -2.3744698, + "Z": 16.494995 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Arcanists' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1045584, + "Position": { + "X": -233.17316, + "Y": 5.999995, + "Z": 167.86438 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] Arcanists' Guild", + "[Limsa Lominsa] Fishermens' Guild" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1045585, + "Position": { + "X": -269.3675, + "Y": 7.352252, + "Z": 201.43433 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "Position": { + "X": -275.1194, + "Y": 11.32725, + "Z": 188.80133 + }, + "TerritoryId": 129, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": -267.55106, + "Y": 11.852168, + "Z": 189.20018 + }, + "TerritoryId": 129, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "DataId": 1045586, + "Position": { + "X": -246.50952, + "Y": 16.347235, + "Z": 192.12634 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1000837, + "Position": { + "X": -289.7536, + "Y": 16.347252, + "Z": 194.53723 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1045587, + "Position": { + "X": -3.7995605, + "Y": 39.999966, + "Z": 36.697876 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1045601, + "Position": { + "X": -26.962769, + "Y": 45.95137, + "Z": -27.054321 + }, + "TerritoryId": 134, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] The Aftcastle", + "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1035095, + "Position": { + "X": 63.004395, + "Y": 14.005002, + "Z": 89.829834 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 4775 + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4775_Gridania's Most Wanted.json b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4775_Gridania's Most Wanted.json new file mode 100644 index 000000000..dd26b96bf --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4775_Gridania's Most Wanted.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": 1035095, + "Position": { + "X": 63.004395, + "Y": 14.005002, + "Z": 89.829834 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1045603, + "Position": { + "X": 56.198975, + "Y": -8.45414, + "Z": 99.22937 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1045604, + "Position": { + "X": 76.89014, + "Y": -6, + "Z": 55.283447 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2013282, + "Position": { + "X": 190.1731, + "Y": -8.529846, + "Z": -44.35797 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2013255, + "Position": { + "X": 341.48157, + "Y": -4.501404, + "Z": -145.8916 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1035095, + "Position": { + "X": 63.004395, + "Y": 14.005002, + "Z": 89.829834 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 4776 + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4776_No Butts About It.json b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4776_No Butts About It.json new file mode 100644 index 000000000..38f690bd0 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4776_No Butts About It.json @@ -0,0 +1,202 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1035095, + "Position": { + "X": 63.004395, + "Y": 14.005002, + "Z": 89.829834 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1045605, + "Position": { + "X": -166.09448, + "Y": 2.0333128, + "Z": -17.288513 + }, + "TerritoryId": 418, + "InteractionType": "Interact", + "AetheryteShortcut": "Ishgard", + "AethernetShortcut": [ + "[Ishgard] Aetheryte Plaza", + "[Ishgard] Skysteel Manufactory" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1045608, + "Position": { + "X": -14.145203, + "Y": 11.965044, + "Z": 27.756104 + }, + "TerritoryId": 419, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ishgard] Skysteel Manufactory", + "[Ishgard] The Last Vigil" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1045609, + "Position": { + "X": -10.8797, + "Y": 11.96515, + "Z": 53.543823 + }, + "TerritoryId": 419, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1045607, + "Position": { + "X": -55.89386, + "Y": 11.965071, + "Z": 39.78015 + }, + "TerritoryId": 419, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1045610, + "Position": { + "X": 30.929932, + "Y": 11.965028, + "Z": 33.6156 + }, + "TerritoryId": 419, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1045713, + "Position": { + "X": 92.454346, + "Y": 24.06099, + "Z": -40.177063 + }, + "TerritoryId": 418, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ishgard] The Last Vigil", + "[Ishgard] The Forgotten Knight" + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1045714, + "Position": { + "X": 65.171265, + "Y": 24.071722, + "Z": -37.521973 + }, + "TerritoryId": 418, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1045714, + "Position": { + "X": 65.171265, + "Y": 24.071722, + "Z": -37.521973 + }, + "TerritoryId": 418, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "NextQuestId": 4777 + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4777_A New Gold Standard.json b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4777_A New Gold Standard.json new file mode 100644 index 000000000..5cc082c67 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4777_A New Gold Standard.json @@ -0,0 +1,70 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1045715, + "Position": { + "X": 21.042175, + "Y": 29.999996, + "Z": -16.342468 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] The Chamber of Rule" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 4778 + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json new file mode 100644 index 000000000..8f5301294 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json @@ -0,0 +1,50 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "StopDistance": 5, + "TerritoryId": 131, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026852, + "Position": { + "X": 63.126587, + "Y": 14.005002, + "Z": 89.86035 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From caf0034f26324553389d45b08005dc07ecd8516d Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 22:20:35 +0100 Subject: [PATCH 035/109] Minor BLU adjustment --- .../Class Quests/BLU/4778_The Brave and the Blue.json | 1 + 1 file changed, 1 insertion(+) diff --git a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json index 8f5301294..ec5804ce9 100644 --- a/QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json +++ b/QuestPaths/6.x - Endwalker/Class Quests/BLU/4778_The Brave and the Blue.json @@ -41,6 +41,7 @@ "Y": 14.005002, "Z": 89.86035 }, + "StopDistance": 5, "TerritoryId": 131, "InteractionType": "CompleteQuest" } From 1e72aac22b1c4525a63a5c9205afaffc6474afcb Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 26 Dec 2024 22:28:50 +0100 Subject: [PATCH 036/109] Handle some particular quest preconditions --- Questionable/Model/QuestInfo.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index 32f80ff45..6e60ac714 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -40,9 +40,9 @@ internal sealed class QuestInfo : IQuestInfo PreviousQuests = new List { - new(new QuestId((ushort)(quest.PreviousQuest[0].RowId & 0xFFFF)), quest.Unknown7), - new(new QuestId((ushort)(quest.PreviousQuest[1].RowId & 0xFFFF))), - new(new QuestId((ushort)(quest.PreviousQuest[2].RowId & 0xFFFF))) + new(ReplaceOldQuestIds((ushort)(quest.PreviousQuest[0].RowId & 0xFFFF)), quest.Unknown7), + new(ReplaceOldQuestIds((ushort)(quest.PreviousQuest[1].RowId & 0xFFFF))), + new(ReplaceOldQuestIds((ushort)(quest.PreviousQuest[2].RowId & 0xFFFF))) } .Where(x => x.QuestId.Value != 0) .ToImmutableList(); @@ -69,6 +69,15 @@ internal sealed class QuestInfo : IQuestInfo Expansion = (EExpansionVersion)quest.Expansion.RowId; } + private static QuestId ReplaceOldQuestIds(ushort questId) + { + return new QuestId(questId switch + { + 524 => 4522, + _ => questId, + }); + } + public ElementId QuestId { get; } public string Name { get; } From 60f94092ab30e01839eb7ad626ba4c519287032e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 27 Dec 2024 00:56:36 +0100 Subject: [PATCH 037/109] Add first batch of Postmoogle quests --- .../1481_Of Errant Epistles.json | 53 ++++ .../1482_Carline Memories.json | 193 +++++++++++++ .../1483_A Debt Unpaid.json | 233 ++++++++++++++++ .../Delivery Moogle Quests/1484_Dream On.json | 113 ++++++++ .../1531_Spirits Most Foul.json | 170 ++++++++++++ .../1532_Dubious Dancing.json | 187 +++++++++++++ .../1533_Stroking the Haft.json | 145 ++++++++++ .../1571_The Captain of Her Heart.json | 180 ++++++++++++ .../1573_Of Siblings and Side-whiskers.json | 113 ++++++++ .../33_Sweet Words, Shadowy Dealings.json | 231 ++++++++++++++++ .../36_Sudul Eht Nioj.json | 261 ++++++++++++++++++ Questionable/Functions/QuestFunctions.cs | 4 + Questionable/Model/QuestInfo.cs | 2 + .../QuestComponents/QuestTooltipComponent.cs | 4 + 14 files changed, 1889 insertions(+) create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1481_Of Errant Epistles.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1482_Carline Memories.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1483_A Debt Unpaid.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1484_Dream On.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1531_Spirits Most Foul.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1532_Dubious Dancing.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1533_Stroking the Haft.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1571_The Captain of Her Heart.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1573_Of Siblings and Side-whiskers.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/33_Sweet Words, Shadowy Dealings.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/36_Sudul Eht Nioj.json diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1481_Of Errant Epistles.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1481_Of Errant Epistles.json new file mode 100644 index 000000000..3fee548c3 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1481_Of Errant Epistles.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1006550, + "Position": { + "X": 449.33228, + "Y": -12.436822, + "Z": -387.5639 + }, + "TerritoryId": 156, + "InteractionType": "AcceptQuest", + "Fly": true, + "AetheryteShortcut": "Mor Dhona", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1003596, + "Position": { + "X": -41.428284, + "Y": 20, + "Z": -5.661133 + }, + "TerritoryId": 129, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Limsa Lominsa", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_SUBPST000_01481_Q1_000_000", + "Yes": true, + "PromptIsRegularExpression": true + } + ], + "NextQuestId": 1483 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1482_Carline Memories.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1482_Carline Memories.json new file mode 100644 index 000000000..1202675a1 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1482_Carline Memories.json @@ -0,0 +1,193 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Airship Landing" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2004266, + "Position": { + "X": 103.715576, + "Y": 1.2664795, + "Z": 46.92151 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2004267, + "Position": { + "X": -67.216064, + "Y": -3.4332886, + "Z": 35.26355 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 2004269, + "Position": { + "X": -141.2528, + "Y": 7.827881, + "Z": -190.53949 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2004268, + "Position": { + "X": 123.91846, + "Y": 14.145081, + "Z": -275.83734 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Mih Khetto's Amphitheatre", + "[Gridania] Lancers' Guild" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Lancers' Guild", + "[Gridania] Airship Landing" + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2004270, + "Position": { + "X": 7.1869507, + "Y": 4.7455444, + "Z": -262.98932 + }, + "StopDistance": 1, + "TerritoryId": 148, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Blue Badger Gate (Central Shroud)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Airship Landing" + ], + "NextQuestId": 1484 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1483_A Debt Unpaid.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1483_A Debt Unpaid.json new file mode 100644 index 000000000..099f03546 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1483_A Debt Unpaid.json @@ -0,0 +1,233 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1003611, + "Position": { + "X": 9.781006, + "Y": 20.999247, + "Z": 15.0911255 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "TargetTerritoryId": 128, + "DialogueChoices": [ + { + "Type": "List", + "ExcelSheet": "Warp", + "Prompt": null, + "Answer": 131093 + } + ] + }, + { + "DataId": 1000972, + "Position": { + "X": 20.279175, + "Y": 40.19993, + "Z": -6.1189575 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_SUBPST002_01483_Q1_000_000", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1003601, + "Position": { + "X": -3.2807007, + "Y": 39.51757, + "Z": -9.414856 + }, + "TerritoryId": 128, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1009183, + "Position": { + "X": -63.21814, + "Y": 43.589653, + "Z": 48.447266 + }, + "TerritoryId": 134, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] The Aftcastle", + "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1009183, + "Position": { + "X": -63.21814, + "Y": 43.589653, + "Z": 48.447266 + }, + "TerritoryId": 134, + "InteractionType": "UseItem", + "ItemId": 2001324 + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1009666, + "Position": { + "X": -22.171448, + "Y": 42.442753, + "Z": 128.67932 + }, + "TerritoryId": 134, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1002626, + "Position": { + "X": 207.2633, + "Y": 112.86037, + "Z": -222.43079 + }, + "TerritoryId": 134, + "InteractionType": "Interact", + "AetheryteShortcut": "Middle La Noscea - Summerford Farms" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 2004272, + "Position": { + "X": 224.2008, + "Y": 114.3053, + "Z": -223.40735 + }, + "TerritoryId": 134, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1009184, + "Position": { + "X": -22.171448, + "Y": 42.442753, + "Z": 128.67932 + }, + "TerritoryId": 134, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Zephyr Gate (Middle La Noscea)" + ] + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1000972, + "Position": { + "X": 20.279175, + "Y": 40.19993, + "Z": -6.1189575 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1003597, + "Position": { + "X": 8.194031, + "Y": 39.999973, + "Z": 17.746216 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "TargetTerritoryId": 129 + }, + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "CompleteQuest", + "NextQuestId": 1482 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1484_Dream On.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1484_Dream On.json new file mode 100644 index 000000000..e832f2acb --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1484_Dream On.json @@ -0,0 +1,113 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001353, + "Position": { + "X": 21.072632, + "Y": 7.45, + "Z": -78.78235 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Adventurers' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1006357, + "Position": { + "X": -28.854858, + "Y": 13.799997, + "Z": 118.66931 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Adventurers' Guild", + "[Ul'dah] Goldsmiths' Guild" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -282.37943, + "Y": 13.480675, + "Z": -155.46162 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Western Thanalan - Horizon", + "Fly": true + }, + { + "DataId": 1009186, + "Position": { + "X": -281.94098, + "Y": 13.480675, + "Z": -156.4508 + }, + "TerritoryId": 140, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001353, + "Position": { + "X": 21.072632, + "Y": 7.45, + "Z": -78.78235 + }, + "TerritoryId": 130, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Adventurers' Guild" + ], + "NextQuestId": 1531 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1531_Spirits Most Foul.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1531_Spirits Most Foul.json new file mode 100644 index 000000000..27dc2af1e --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1531_Spirits Most Foul.json @@ -0,0 +1,170 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1000705, + "Position": { + "X": -243.15253, + "Y": -4.000101, + "Z": -7.950012 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Conjurers' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1006238, + "Position": { + "X": 197.77222, + "Y": 7.8551226, + "Z": -22.14087 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "AetheryteShortcut": "South Shroud - Quarrymill", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1000312, + "Position": { + "X": 269.6421, + "Y": 7.877909, + "Z": -206.34778 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1000338, + "Position": { + "X": 268.20776, + "Y": 10.393627, + "Z": -250.11066 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1000340, + "Position": { + "X": 277.51575, + "Y": 11.186312, + "Z": -255.60394 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 265.58423, + "Y": 9.040689, + "Z": -227.60555 + }, + "TerritoryId": 153, + "InteractionType": "WalkTo" + }, + { + "DataId": 2004282, + "Position": { + "X": 261.5548, + "Y": 15.42688, + "Z": -125.90222 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000705, + "Position": { + "X": -243.15253, + "Y": -4.000101, + "Z": -7.950012 + }, + "TerritoryId": 133, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Conjurers' Guild" + ], + "NextQuestId": 1532 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1532_Dubious Dancing.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1532_Dubious Dancing.json new file mode 100644 index 000000000..f99c589b8 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1532_Dubious Dancing.json @@ -0,0 +1,187 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006273, + "Position": { + "X": 619.0126, + "Y": 23.936245, + "Z": 455.10022 + }, + "TerritoryId": 137, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1009267, + "Position": { + "X": 194.20154, + "Y": 59.531815, + "Z": -144.54877 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -348.54996, + "Y": 67.72218, + "Z": -344.0944 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true + }, + { + "DataId": 1009268, + "Position": { + "X": -319.9054, + "Y": 4.416262, + "Z": -571.40466 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1009268, + "Position": { + "X": -319.9054, + "Y": 4.416262, + "Z": -571.40466 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001334 + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1009268, + "Position": { + "X": -319.9054, + "Y": 4.416262, + "Z": -571.40466 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001334 + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1009268, + "Position": { + "X": -319.9054, + "Y": 4.416262, + "Z": -571.40466 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001334 + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1006273, + "Position": { + "X": 619.0126, + "Y": 23.936245, + "Z": 455.10022 + }, + "TerritoryId": 137, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "Fly": true + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 2004284, + "Position": { + "X": 517.32654, + "Y": 12.558105, + "Z": 78.93494 + }, + "TerritoryId": 137, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006273, + "Position": { + "X": 619.0126, + "Y": 23.936245, + "Z": 455.10022 + }, + "TerritoryId": 137, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "Fly": true, + "NextQuestId": 1533 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1533_Stroking the Haft.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1533_Stroking the Haft.json new file mode 100644 index 000000000..aa0347b6c --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1533_Stroking the Haft.json @@ -0,0 +1,145 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1009271, + "Position": { + "X": 149.9198, + "Y": 7.492006, + "Z": 109.391846 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1009272, + "Position": { + "X": -39.16992, + "Y": 13.499999, + "Z": 104.99719 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Weavers' Guild", + "[Ul'dah] Goldsmiths' Guild" + ], + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST007_01533_Q1_000_000", + "Answer": "TEXT_SUBPST007_01533_A1_000_002" + } + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1009273, + "Position": { + "X": -120.74469, + "Y": 41.50016, + "Z": 134.5083 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Goldsmiths' Guild", + "[Ul'dah] Alchemists' Guild" + ], + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST007_01533_Q2_000_000", + "Answer": "TEXT_SUBPST007_01533_A2_000_001" + } + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 112.655914, + "Y": 8.361085, + "Z": 73.20917 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo", + "AethernetShortcut": [ + "[Ul'dah] Alchemists' Guild", + "[Ul'dah] Weavers' Guild" + ], + "RestartNavigationIfCancelled": false + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1009369, + "Position": { + "X": 151.26257, + "Y": 7.492006, + "Z": 109.84961 + }, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 1571 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1571_The Captain of Her Heart.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1571_The Captain of Her Heart.json new file mode 100644 index 000000000..91679b7e7 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1571_The Captain of Her Heart.json @@ -0,0 +1,180 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006331, + "Position": { + "X": -144.15204, + "Y": 64.989944, + "Z": -209.88788 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1009726, + "Position": { + "X": -280.8728, + "Y": 62.620903, + "Z": -201.9837 + }, + "StopDistance": 0.5, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 2864, + 2865, + 2866 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + { + "Low": 3 + }, + null, + null, + null, + null, + null + ] + }, + { + "DataId": 1009726, + "Position": { + "X": -280.8728, + "Y": 62.620903, + "Z": -201.9837 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1006331, + "Position": { + "X": -144.15204, + "Y": 64.989944, + "Z": -209.88788 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1009729, + "Position": { + "X": -108.72058, + "Y": 64.30314, + "Z": -220.38611 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1009730, + "Position": { + "X": -145.8305, + "Y": 64.83713, + "Z": -209.24695 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1009732, + "Position": { + "X": -439.59723, + "Y": 50.90922, + "Z": -319.69183 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1009753, + "Position": { + "X": -107.408325, + "Y": 64.38365, + "Z": -223.62103 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006331, + "Position": { + "X": -144.15204, + "Y": 64.989944, + "Z": -209.88788 + }, + "TerritoryId": 180, + "InteractionType": "CompleteQuest", + "NextQuestId": 33 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1573_Of Siblings and Side-whiskers.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1573_Of Siblings and Side-whiskers.json new file mode 100644 index 000000000..c5dc058e9 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1573_Of Siblings and Side-whiskers.json @@ -0,0 +1,113 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1009739, + "Position": { + "X": -103.83765, + "Y": 40, + "Z": 113.206665 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1000153, + "Position": { + "X": -44.87683, + "Y": -1.2500024, + "Z": 56.839844 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -103.88594, + "Y": 41.50016, + "Z": 119.898315 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Alchemists' Guild" + ] + }, + { + "DataId": 1002299, + "Position": { + "X": -98.8938, + "Y": 40.200146, + "Z": 120.83618 + }, + "StopDistance": 7, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1009744, + "Position": { + "X": -47.470886, + "Y": 40, + "Z": 60.68506 + }, + "TerritoryId": 128, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ], + "NextQuestId": 1485 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/33_Sweet Words, Shadowy Dealings.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/33_Sweet Words, Shadowy Dealings.json new file mode 100644 index 000000000..22693e403 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/33_Sweet Words, Shadowy Dealings.json @@ -0,0 +1,231 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1009949, + "Position": { + "X": -325.70386, + "Y": 7.228748, + "Z": -215.16754 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Botanists' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1009952, + "Position": { + "X": 41.61133, + "Y": 1.8386029, + "Z": -117.265625 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Botanists' Guild", + "[Gridania] Leatherworkers' Guild & Shaded Bower" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1000768, + "Position": { + "X": 172.35059, + "Y": 15.5, + "Z": -89.951965 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1000227, + "Position": { + "X": 168.62744, + "Y": 15.699999, + "Z": -65.690125 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1000228, + "Position": { + "X": 168.20007, + "Y": 15.69998, + "Z": -64.83563 + }, + "StopDistance": 5, + "TerritoryId": 133, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1009952, + "Position": { + "X": 41.61133, + "Y": 1.8386029, + "Z": -117.265625 + }, + "TerritoryId": 133, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1000243, + "Position": { + "X": 170.03125, + "Y": 15.699999, + "Z": -127.03143 + }, + "TerritoryId": 133, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1009952, + "Position": { + "X": 41.61133, + "Y": 1.8386029, + "Z": -117.265625 + }, + "TerritoryId": 133, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "Position": { + "X": -374.96555, + "Y": 63.686344, + "Z": -206.74146 + }, + "StopDistance": 0.5, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 2863 + ], + "AethernetShortcut": [ + "[Gridania] Leatherworkers' Guild & Shaded Bower", + "[Gridania] White Wolf Gate (Central Shroud)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1001276, + "Position": { + "X": 13.961914, + "Y": 0.1373291, + "Z": 2.090454 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1009953, + "Position": { + "X": 31.5708, + "Y": -19.000002, + "Z": 100.48059 + }, + "TerritoryId": 132, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Airship Landing" + ], + "NextQuestId": 36 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/36_Sudul Eht Nioj.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/36_Sudul Eht Nioj.json new file mode 100644 index 000000000..90e75dbd1 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/36_Sudul Eht Nioj.json @@ -0,0 +1,261 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1009781, + "Position": { + "X": -89.829956, + "Y": 5.2000036, + "Z": 45.426025 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gladiators' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2004614, + "Position": { + "X": -80.76605, + "Y": 8.895996, + "Z": -16.739136 + }, + "TerritoryId": 131, + "InteractionType": "UseItem", + "ItemId": 2001459, + "IgnoreDistanceToObject": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2004616, + "Position": { + "X": -98.1308, + "Y": 8.987488, + "Z": -16.617126 + }, + "TerritoryId": 131, + "InteractionType": "UseItem", + "ItemId": 2001459, + "IgnoreDistanceToObject": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "Position": { + "X": -113.42244, + "Y": 7.9935846, + "Z": -8.936225 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo" + }, + { + "DataId": 1001859, + "Position": { + "X": -142.71765, + "Y": 11.999999, + "Z": -15.610046 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1009789, + "Position": { + "X": -159.68573, + "Y": 12.596368, + "Z": 0.869751 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -117.18245, + "Y": 9.232903, + "Z": 9.133285 + }, + "TerritoryId": 130, + "InteractionType": "WalkTo" + }, + { + "DataId": 1009785, + "Position": { + "X": -88.15143, + "Y": 5.200004, + "Z": 45.303955 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1001675, + "Position": { + "X": -89.49426, + "Y": 7.008118, + "Z": 10.849121 + }, + "TerritoryId": 131, + "InteractionType": "Emote", + "Emote": "welcome" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": -112.38632, + "Y": 7.6503563, + "Z": 9.034383 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo" + }, + { + "DataId": 1009792, + "Position": { + "X": -135.36285, + "Y": 10.9999895, + "Z": 0.015197754 + }, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1009791, + "Position": { + "X": -13.778931, + "Y": 3.9999998, + "Z": -151.4458 + }, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "Position": { + "X": 44.151344, + "Y": 4.0195827, + "Z": -165.77715 + }, + "TerritoryId": 130, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": -172.42809, + "Y": 16.059729, + "Z": 276.30084 + }, + "StopDistance": 0.5, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 2853, + 3120 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1009794, + "Position": { + "X": -174.45642, + "Y": 16.149345, + "Z": 275.6847 + }, + "TerritoryId": 141, + "InteractionType": "CompleteQuest", + "NextQuestId": 1573 + } + ] + } + ] +} diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index 8c937bcc9..d44f1e52b 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -561,6 +561,10 @@ internal sealed unsafe class QuestFunctions if (questInfo.AlliedSociety != EAlliedSociety.None && questInfo.IsRepeatable) return !IsDailyAlliedSocietyQuestAndAvailableToday(questId); + if (questInfo.MoogleDeliveryLevel > 0 && + questInfo.MoogleDeliveryLevel > PlayerState.Instance()->DeliveryLevel) + return true; + return !HasCompletedPreviousQuests(questInfo, extraCompletedQuest) || !HasCompletedPreviousInstances(questInfo); } diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index 6e60ac714..03d1088c2 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -66,6 +66,7 @@ internal sealed class QuestInfo : IQuestInfo IsSeasonalEvent = quest.Festival.RowId != 0; NewGamePlusChapter = newGamePlusChapter; StartingCity = startingCity; + MoogleDeliveryLevel = (byte)quest.DeliveryQuest.RowId; Expansion = (EExpansionVersion)quest.Expansion.RowId; } @@ -102,6 +103,7 @@ internal sealed class QuestInfo : IQuestInfo public bool IsSeasonalEvent { get; } public uint NewGamePlusChapter { get; } public byte StartingCity { get; set; } + public byte MoogleDeliveryLevel { get; } public EExpansionVersion Expansion { get; } public void AddPreviousQuest(PreviousQuestInfo questId) diff --git a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs index 4d4f1d2c3..bcf823ae6 100644 --- a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs +++ b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs @@ -130,6 +130,10 @@ internal sealed class QuestTooltipComponent if (questInfo is QuestInfo actualQuestInfo) { + if (actualQuestInfo.MoogleDeliveryLevel > 0) + ImGui.Text($"Requires Carrier Level {actualQuestInfo.MoogleDeliveryLevel}"); + + if (counter == 0 && actualQuestInfo.QuestLocks.Count > 0) { ImGui.Separator(); From 98197b668745f5b5738772d6a92f75c35b119a7c Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 27 Dec 2024 01:34:15 +0100 Subject: [PATCH 038/109] Add 'Beauty Is Only Scalp Deep' --- .../Misc/1210_Beauty Is Only Scalp Deep.json | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 QuestPaths/2.x - A Realm Reborn/Unlocks/Misc/1210_Beauty Is Only Scalp Deep.json diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Misc/1210_Beauty Is Only Scalp Deep.json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Misc/1210_Beauty Is Only Scalp Deep.json new file mode 100644 index 000000000..bf89524c8 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Misc/1210_Beauty Is Only Scalp Deep.json @@ -0,0 +1,172 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1003601, + "Position": { + "X": -3.2807007, + "Y": 39.51757, + "Z": -9.414856 + }, + "TerritoryId": 128, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1005516, + "Position": { + "X": -46.0365, + "Y": 40, + "Z": 63.767456 + }, + "TerritoryId": 128, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1005515, + "Position": { + "X": -44.449524, + "Y": 39.999996, + "Z": 61.81433 + }, + "TerritoryId": 128, + "InteractionType": "Emote", + "Emote": "doubt" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1001000, + "Position": { + "X": -32.028687, + "Y": 41.499985, + "Z": 208.39233 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1000153, + "Position": { + "X": -44.87683, + "Y": -1.2500024, + "Z": 56.839844 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -103.88594, + "Y": 41.50016, + "Z": 119.898315 + }, + "TerritoryId": 131, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Alchemists' Guild" + ], + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + } + }, + { + "DataId": 1002299, + "Position": { + "X": -98.8938, + "Y": 40.200146, + "Z": 120.83618 + }, + "StopDistance": 7, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005515, + "Position": { + "X": -44.449524, + "Y": 39.999996, + "Z": 61.81433 + }, + "TerritoryId": 128, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + } + ] +} From aa70f4c55a7ec1bc000a7e313ed5df201724e3b3 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 27 Dec 2024 17:45:30 +0100 Subject: [PATCH 039/109] Add second batch of postmoogle quests --- .../Central Shroud/804_Fungal Frolic.json | 104 +++++++ .../805_Shocking Discoveries.json | 88 ++++++ .../807_Doing the Dirty Work.json | 89 ++++++ .../1485_Thwack-a-Mole.json | 166 +++++++++++ .../1570_Death of a Mailman.json | 136 +++++++++ .../1572_Thanks for Your Support.json | 146 +++++++++ ...574_The Past Is a Story We Never Tell.json | 266 +++++++++++++++++ .../1575_Hostages to Fortune.json | 248 +++++++++++++++ .../1576_All in the Family.json | 217 ++++++++++++++ .../1577_Duel Personalities.json | 197 ++++++++++++ .../240_Blues on Emerald Avenue.json | 238 +++++++++++++++ .../241_Lone Survivor.json | 190 ++++++++++++ .../242_Guildmaster, Prelate, and Plot.json | 282 ++++++++++++++++++ .../243_A Qiqirn Always Pays His Debts.json | 194 ++++++++++++ .../244_The Hazy Professor.json | 230 ++++++++++++++ .../362_The Little Postmoogle That Could.json | 217 ++++++++++++++ .../496_Better Left Unfound.json | 116 +++++++ Questionable/Functions/QuestFunctions.cs | 14 +- Questionable/Model/QuestInfo.cs | 1 + 19 files changed, 3136 insertions(+), 3 deletions(-) create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/804_Fungal Frolic.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/805_Shocking Discoveries.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/807_Doing the Dirty Work.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1485_Thwack-a-Mole.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1570_Death of a Mailman.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1572_Thanks for Your Support.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1574_The Past Is a Story We Never Tell.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1575_Hostages to Fortune.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1576_All in the Family.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1577_Duel Personalities.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/240_Blues on Emerald Avenue.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/241_Lone Survivor.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/242_Guildmaster, Prelate, and Plot.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/243_A Qiqirn Always Pays His Debts.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/244_The Hazy Professor.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/362_The Little Postmoogle That Could.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/496_Better Left Unfound.json diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/804_Fungal Frolic.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/804_Fungal Frolic.json new file mode 100644 index 000000000..f2e9316a0 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/804_Fungal Frolic.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "Fly": true, + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -294.20667, + "Y": 61.58862, + "Z": -192.54443 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 48, + "CompletionQuestVariablesFlags": [ + null, + { + "High": 5 + }, + null, + null, + null, + null + ] + } + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + { + "High": 5 + }, + null, + null, + null, + null + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "CompleteQuest", + "NextQuestId": 805 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/805_Shocking Discoveries.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/805_Shocking Discoveries.json new file mode 100644 index 000000000..b0f7b06a4 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/805_Shocking Discoveries.json @@ -0,0 +1,88 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "Fly": true, + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -291.6655, + "Y": 60.450222, + "Z": -163.48296 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 2267 + } + ], + "CombatItemUse": { + "ItemId": 2000632, + "Condition": "Health%", + "Value": 50 + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "CompleteQuest", + "NextQuestId": 807 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/807_Doing the Dirty Work.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/807_Doing the Dirty Work.json new file mode 100644 index 000000000..26dee00db --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Central Shroud/807_Doing the Dirty Work.json @@ -0,0 +1,89 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "Fly": true, + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -327.70383, + "Y": 57.159073, + "Z": -13.640016 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 2193, + "NameId": 2057 + } + ], + "CombatItemUse": { + "ItemId": 2000958, + "Condition": "Health%", + "Value": 100 + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "CompleteQuest", + "NextQuestId": 1485 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1485_Thwack-a-Mole.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1485_Thwack-a-Mole.json new file mode 100644 index 000000000..d55472661 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1485_Thwack-a-Mole.json @@ -0,0 +1,166 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "Fly": true, + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1001455, + "Position": { + "X": 59.952637, + "Y": 0.99176025, + "Z": 255.8479 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gate of Nald (Central Thanalan)" + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2004276, + "Position": { + "X": 70.2677, + "Y": 1.2054443, + "Z": 250.53784 + }, + "TerritoryId": 141, + "InteractionType": "UseItem", + "ItemId": 2001329 + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2004277, + "Position": { + "X": 70.2677, + "Y": 1.2054443, + "Z": 250.53784 + }, + "TerritoryId": 141, + "InteractionType": "UseItem", + "ItemId": 2001328, + "DelaySecondsAtStart": 3 + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2004277, + "Position": { + "X": 70.2677, + "Y": 1.2054443, + "Z": 250.53784 + }, + "TerritoryId": 141, + "InteractionType": "Combat", + "EnemySpawnType": "FinishCombatIfAny", + "KillEnemyDataIds": [] + }, + { + "DataId": 1009187, + "Position": { + "X": 70.573, + "Y": 1.5015054, + "Z": 251.39233 + }, + "TerritoryId": 141, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -243.19783, + "Y": 58.69102, + "Z": -140.41818 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "Fly": true + }, + { + "DataId": 1006261, + "Position": { + "X": -244.73944, + "Y": 58.69352, + "Z": -140.06262 + }, + "TerritoryId": 148, + "InteractionType": "CompleteQuest", + "NextQuestId": 1570 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1570_Death of a Mailman.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1570_Death of a Mailman.json new file mode 100644 index 000000000..2af9652dd --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1570_Death of a Mailman.json @@ -0,0 +1,136 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -139.04318, + "Y": 8.522301, + "Z": 280.0128 + }, + "TerritoryId": 153, + "InteractionType": "WalkTo", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "Fly": true, + "SkipConditions": { + "StepIf": { + "Flying": "Locked" + } + }, + "$": "Post-ARR, flying always unlocked" + }, + { + "DataId": 1006751, + "Position": { + "X": -139.45221, + "Y": 8.712891, + "Z": 281.69678 + }, + "TerritoryId": 153, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2004573, + "Position": { + "X": 36.545288, + "Y": -3.7080078, + "Z": 225.7572 + }, + "TerritoryId": 152, + "InteractionType": "Interact", + "AetheryteShortcut": "East Shroud - Hawthorne Hut", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -83.15885, + "Y": -5.7812023, + "Z": 321.49606 + }, + "StopDistance": 0.5, + "TerritoryId": 152, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 3552, + 3553 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1009721, + "Position": { + "X": -83.36011, + "Y": -5.6851597, + "Z": 322.43823 + }, + "TerritoryId": 152, + "InteractionType": "CompleteQuest", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST010_01570_Q1_000_000", + "Answer": "TEXT_SUBPST010_01570_A1_000_002" + } + ], + "NextQuestId": 1576 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1572_Thanks for Your Support.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1572_Thanks for Your Support.json new file mode 100644 index 000000000..aea6ec8cd --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1572_Thanks for Your Support.json @@ -0,0 +1,146 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1000856, + "Position": { + "X": -155.10797, + "Y": 4.070978, + "Z": 202.71606 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Fishermens' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1009733, + "Position": { + "X": -356.31348, + "Y": 8.000001, + "Z": 49.54602 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] Fishermens' Guild", + "[Limsa Lominsa] Arcanists' Guild" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2004568, + "Position": { + "X": -356.31348, + "Y": 7.9804688, + "Z": 48.90515 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2004570, + "Position": { + "X": -83.634705, + "Y": 1.9378662, + "Z": 826.10803 + }, + "TerritoryId": 135, + "InteractionType": "UseItem", + "ItemId": 2001446, + "AetheryteShortcut": "Lower La Noscea - Moraby Drydocks", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001016, + "Position": { + "X": -42.679565, + "Y": 39.999947, + "Z": 119.920654 + }, + "TerritoryId": 128, + "InteractionType": "PurchaseItem", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ], + "PurchaseMenu": { + "ExcelSheet": "GilShop", + "Key": 262186 + }, + "ItemId": 4870, + "ItemCount": 1 + }, + { + "Position": { + "X": -82.249344, + "Y": 2.1958525, + "Z": 826.0164 + }, + "TerritoryId": 135, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Lower La Noscea - Moraby Drydocks", + "Fly": true + }, + { + "DataId": 1009735, + "Position": { + "X": -84.21454, + "Y": 1.802455, + "Z": 826.5963 + }, + "TerritoryId": 135, + "InteractionType": "CompleteQuest", + "NextQuestId": 1575 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1574_The Past Is a Story We Never Tell.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1574_The Past Is a Story We Never Tell.json new file mode 100644 index 000000000..7cfa810b6 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1574_The Past Is a Story We Never Tell.json @@ -0,0 +1,266 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Fishermens' Guild", + "[Limsa Lominsa] Aetheryte Plaza" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001263, + "Position": { + "X": 181.41443, + "Y": -2.3519497, + "Z": -240.40594 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Lancers' Guild" + ], + "TargetTerritoryId": 152 + }, + { + "DataId": 1009754, + "Position": { + "X": -571.4351, + "Y": 10.28263, + "Z": 61.020752 + }, + "TerritoryId": 152, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2004581, + "Position": { + "X": 354.72632, + "Y": 5.5999756, + "Z": -30.167114 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2843 + ], + "AetheryteShortcut": "South Shroud - Quarrymill", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2004582, + "Position": { + "X": 343.2821, + "Y": 2.4261475, + "Z": 8.895996 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2843 + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2004845, + "Position": { + "X": 362.50854, + "Y": 1.663208, + "Z": -18.478699 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST014_01574_Q1_000_000", + "Answer": "TEXT_SUBPST014_01574_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1009755, + "Position": { + "X": 361.19617, + "Y": 1.6090399, + "Z": -18.448242 + }, + "TerritoryId": 153, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1009756, + "Position": { + "X": 377.40137, + "Y": 0.37321654, + "Z": 119.920654 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1001263, + "Position": { + "X": 181.41443, + "Y": -2.3519497, + "Z": -240.40594 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Lancers' Guild" + ], + "TargetTerritoryId": 152 + }, + { + "DataId": 1009754, + "Position": { + "X": -571.4351, + "Y": 10.28263, + "Z": 61.020752 + }, + "TerritoryId": 152, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1009758, + "Position": { + "X": -161.24213, + "Y": 7.554849, + "Z": 107.10303 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "Fly": true + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 2004846, + "Position": { + "X": -181.44507, + "Y": 8.0720215, + "Z": 101.27405 + }, + "TerritoryId": 153, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2863, + 3558 + ] + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1009760, + "Position": { + "X": -235.21783, + "Y": 6.619436, + "Z": 609.39954 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1009760, + "Position": { + "X": -235.21783, + "Y": 6.619436, + "Z": 609.39954 + }, + "TerritoryId": 153, + "InteractionType": "CompleteQuest", + "NextQuestId": 1572 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1575_Hostages to Fortune.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1575_Hostages to Fortune.json new file mode 100644 index 000000000..280ee6517 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1575_Hostages to Fortune.json @@ -0,0 +1,248 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006406, + "Position": { + "X": 63.156982, + "Y": -13.3626, + "Z": 140.91699 + }, + "TerritoryId": 154, + "InteractionType": "Interact", + "AetheryteShortcut": "North Shroud - Fallgourd Float" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 328.4609, + "Y": -5.423937, + "Z": 266.34305 + }, + "StopDistance": 0.5, + "TerritoryId": 154, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 3556, + 3557 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1010405, + "Position": { + "X": 334.73718, + "Y": -6.0854516, + "Z": 270.74072 + }, + "TerritoryId": 154, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST015_01575_Q1_000_070", + "Answer": "TEXT_SUBPST015_01575_A1_001_070" + } + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1010407, + "Position": { + "X": 225.54358, + "Y": -25.225279, + "Z": 233.56982 + }, + "TerritoryId": 154, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1010408, + "Position": { + "X": 47.837036, + "Y": -34.920486, + "Z": 275.89832 + }, + "TerritoryId": 154, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1006406, + "Position": { + "X": 63.156982, + "Y": -13.3626, + "Z": 140.91699 + }, + "TerritoryId": 154, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "Position": { + "X": -31.059683, + "Y": -40.708477, + "Z": 195.24632 + }, + "TerritoryId": 154, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1010409, + "Position": { + "X": -20.279297, + "Y": -34.656372, + "Z": 172.13696 + }, + "TerritoryId": 154, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1006406, + "Position": { + "X": 63.156982, + "Y": -13.3626, + "Z": 140.91699 + }, + "TerritoryId": 154, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1010410, + "Position": { + "X": 9.567322, + "Y": -10.024739, + "Z": 22.934265 + }, + "TerritoryId": 154, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 10, + "Steps": [ + { + "DataId": 1010509, + "Position": { + "X": 63.370728, + "Y": -13.485855, + "Z": 141.86316 + }, + "TerritoryId": 154, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 11, + "Steps": [ + { + "Position": { + "X": -31.059683, + "Y": -40.708477, + "Z": 195.24632 + }, + "TerritoryId": 154, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1010409, + "Position": { + "X": -20.279297, + "Y": -34.656372, + "Z": 172.13696 + }, + "TerritoryId": 154, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006406, + "Position": { + "X": 63.156982, + "Y": -13.3626, + "Z": 140.91699 + }, + "TerritoryId": 154, + "InteractionType": "CompleteQuest", + "Fly": true, + "NextQuestId": 243 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1576_All in the Family.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1576_All in the Family.json new file mode 100644 index 000000000..e98e25de2 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1576_All in the Family.json @@ -0,0 +1,217 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006211, + "Position": { + "X": -217.48688, + "Y": 26.258211, + "Z": -361.2574 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "AetheryteShortcut": "Southern Thanalan - Little Ala Mhigo" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -255.1732, + "Y": 27.485052, + "Z": -324.7051 + }, + "TerritoryId": 146, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "DataId": 2004884, + "Position": { + "X": -64.86609, + "Y": -1.5411987, + "Z": -69.50488 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 4 + ] + }, + { + "DataId": 2004883, + "Position": { + "X": -53.635498, + "Y": -1.3886108, + "Z": -53.391357 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + }, + { + "DataId": 2004882, + "Position": { + "X": -69.077576, + "Y": -2.1820679, + "Z": -32.913757 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1006211, + "Position": { + "X": -217.48688, + "Y": 26.258211, + "Z": -361.2574 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "AetheryteShortcut": "Southern Thanalan - Little Ala Mhigo" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1006196, + "Position": { + "X": -63.98114, + "Y": -20.296238, + "Z": -5.142395 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": -155.2711, + "Y": -32.952675, + "Z": 242.00226 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": -155.2711, + "Y": -32.952675, + "Z": 242.00226 + }, + "TerritoryId": 145, + "InteractionType": "Combat", + "EnemySpawnType": "FinishCombatIfAny", + "KillEnemyDataIds": [ + 3554, + 3555 + ] + }, + { + "DataId": 1010417, + "Position": { + "X": -154.37555, + "Y": -31.787657, + "Z": 244.7699 + }, + "StopDistance": 5, + "TerritoryId": 145, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1006196, + "Position": { + "X": -63.98114, + "Y": -20.296238, + "Z": -5.142395 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1006211, + "Position": { + "X": -217.48688, + "Y": 26.258211, + "Z": -361.2574 + }, + "TerritoryId": 146, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Southern Thanalan - Little Ala Mhigo", + "NextQuestId": 1577 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1577_Duel Personalities.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1577_Duel Personalities.json new file mode 100644 index 000000000..c13c0cf91 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/1577_Duel Personalities.json @@ -0,0 +1,197 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -99.05126, + "Y": 19.82, + "Z": 88.622086 + }, + "TerritoryId": 129, + "InteractionType": "WalkTo" + }, + { + "DataId": 1010419, + "Position": { + "X": -117.84546, + "Y": 21.38377, + "Z": 83.604126 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -90.47176, + "Y": 22.179348, + "Z": 116.58494 + }, + "TerritoryId": 129, + "InteractionType": "WalkTo" + }, + { + "DataId": 1010420, + "Position": { + "X": -10.208313, + "Y": 39.51757, + "Z": -1.8463745 + }, + "TerritoryId": 128, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1003597, + "Position": { + "X": 8.194031, + "Y": 39.999973, + "Z": 17.746216 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "TargetTerritoryId": 129 + }, + { + "DataId": 1010423, + "Position": { + "X": -20.73706, + "Y": 19.999937, + "Z": 4.257263 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1002433, + "Position": { + "X": -6.729248, + "Y": 20.333345, + "Z": -0.7477417 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1010423, + "Position": { + "X": -20.73706, + "Y": 19.999937, + "Z": 4.257263 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1010424, + "Position": { + "X": -172.59485, + "Y": 4.284276, + "Z": 168.07812 + }, + "TerritoryId": 129, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Fishermens' Guild" + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1000857, + "Position": { + "X": -165.27051, + "Y": 5.2500057, + "Z": 164.29382 + }, + "StopDistance": 7, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1010424, + "Position": { + "X": -172.59485, + "Y": 4.284276, + "Z": 168.07812 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1010521, + "Position": { + "X": -184.64948, + "Y": 1.9999955, + "Z": 201.28174 + }, + "TerritoryId": 129, + "InteractionType": "CompleteQuest", + "NextQuestId": 241 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/240_Blues on Emerald Avenue.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/240_Blues on Emerald Avenue.json new file mode 100644 index 000000000..52319d99b --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/240_Blues on Emerald Avenue.json @@ -0,0 +1,238 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001285, + "Position": { + "X": -68.77246, + "Y": 4.0411124, + "Z": -126.51257 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 326.4774, + "Y": 62.89536, + "Z": -207.31602 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Western Thanalan - Horizon", + "Fly": true + }, + { + "DataId": 2004847, + "Position": { + "X": 323.62854, + "Y": 62.974, + "Z": -207.90424 + }, + "TerritoryId": 140, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1001285, + "Position": { + "X": -68.77246, + "Y": 4.0411124, + "Z": -126.51257 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1003908, + "Position": { + "X": 137.95679, + "Y": 4.041112, + "Z": -41.09259 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Sapphire Avenue Exchange" + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1001679, + "Position": { + "X": 140.48975, + "Y": 4.0099983, + "Z": -59.80017 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1001285, + "Position": { + "X": -68.77246, + "Y": 4.0411124, + "Z": -126.51257 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ul'dah] Sapphire Avenue Exchange", + "[Ul'dah] Aetheryte Plaza" + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "Position": { + "X": -77.95643, + "Y": -12.787907, + "Z": -45.044247 + }, + "TerritoryId": 141, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Central Thanalan - Black Brush Station", + "Fly": true, + "$": "Coffer & Coffin (outside)" + }, + { + "DataId": 1010341, + "Position": { + "X": -89.40265, + "Y": -11.35, + "Z": -40.146484 + }, + "TerritoryId": 141, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1001285, + "Position": { + "X": -68.77246, + "Y": 4.0411124, + "Z": -126.51257 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah" + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1010342, + "Position": { + "X": -189.50183, + "Y": 16.85818, + "Z": -418.8449 + }, + "TerritoryId": 141, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Thanalan - Black Brush Station", + "Fly": true + } + ] + }, + { + "Sequence": 10, + "Steps": [ + { + "DataId": 1010346, + "Position": { + "X": -207.44641, + "Y": 18.499998, + "Z": 73.899414 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Thaumaturges' Guild" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001285, + "Position": { + "X": -68.77246, + "Y": 4.0411124, + "Z": -126.51257 + }, + "TerritoryId": 130, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Ul'dah] Thaumaturges' Guild", + "[Ul'dah] Aetheryte Plaza" + ], + "NextQuestId": 496 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/241_Lone Survivor.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/241_Lone Survivor.json new file mode 100644 index 000000000..1a48a0b66 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/241_Lone Survivor.json @@ -0,0 +1,190 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Fishermens' Guild", + "[Limsa Lominsa] Aetheryte Plaza" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -371.6037, + "Y": 54.310753, + "Z": 428.55798 + }, + "TerritoryId": 137, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Eastern La Noscea - Wineport", + "Fly": true + }, + { + "DataId": 1006312, + "Position": { + "X": -369.0395, + "Y": 54.28071, + "Z": 441.24512 + }, + "TerritoryId": 137, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -371.6037, + "Y": 54.310753, + "Z": 428.55798 + }, + "TerritoryId": 137, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "Position": { + "X": -250.51706, + "Y": 48.854584, + "Z": 462.12476 + }, + "TerritoryId": 137, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 2004858, + "Position": { + "X": -252.76575, + "Y": 49.66809, + "Z": 460.71558 + }, + "TerritoryId": 137, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -371.6037, + "Y": 54.310753, + "Z": 428.55798 + }, + "TerritoryId": 137, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1006312, + "Position": { + "X": -369.0395, + "Y": 54.28071, + "Z": 441.24512 + }, + "TerritoryId": 137, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -371.6037, + "Y": 54.310753, + "Z": 428.55798 + }, + "TerritoryId": 137, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "Position": { + "X": -133.36604, + "Y": 70.192245, + "Z": 746.02716 + }, + "TerritoryId": 137, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "Position": { + "X": 570.5895, + "Y": 95.61268, + "Z": -497.8778 + }, + "TerritoryId": 135, + "InteractionType": "WalkTo", + "RestartNavigationIfCancelled": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 569.87854, + "Y": 95.62417, + "Z": -498.10028 + }, + "TerritoryId": 135, + "InteractionType": "Combat", + "EnemySpawnType": "FinishCombatIfAny", + "KillEnemyDataIds": [ + 2861, + 3563, + 3562 + ] + }, + { + "DataId": 1010370, + "Position": { + "X": 569.87854, + "Y": 95.62417, + "Z": -498.10028 + }, + "TerritoryId": 135, + "InteractionType": "CompleteQuest", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST021_00241_Q1_000_000", + "Answer": "TEXT_SUBPST021_00241_A1_000_001" + } + ], + "NextQuestId": 242 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/242_Guildmaster, Prelate, and Plot.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/242_Guildmaster, Prelate, and Plot.json new file mode 100644 index 000000000..9e3f79df2 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/242_Guildmaster, Prelate, and Plot.json @@ -0,0 +1,282 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Fishermens' Guild", + "[Limsa Lominsa] Aetheryte Plaza" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001708, + "Position": { + "X": -250.3548, + "Y": 18, + "Z": 80.88806 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Thaumaturges' Guild" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1002279, + "Position": { + "X": -196.8872, + "Y": 18.459997, + "Z": 59.952637 + }, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1001708, + "Position": { + "X": -250.3548, + "Y": 18, + "Z": 80.88806 + }, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1001711, + "Position": { + "X": -241.62665, + "Y": 18.8, + "Z": 83.32947 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1001294, + "Position": { + "X": -214.22144, + "Y": 18.5, + "Z": 72.129395 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1001289, + "Position": { + "X": -207.90424, + "Y": 18.5, + "Z": 70.7865 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1001288, + "Position": { + "X": -151.59845, + "Y": 12, + "Z": 16.220276 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1001708, + "Position": { + "X": -250.3548, + "Y": 18, + "Z": 80.88806 + }, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 2004886, + "Position": { + "X": -245.19727, + "Y": 19.150085, + "Z": 63.67578 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2004885, + "Position": { + "X": -206.50043, + "Y": 19.180542, + "Z": 49.94275 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2004887, + "Position": { + "X": -194.11005, + "Y": 19.150085, + "Z": 91.325195 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2004888, + "Position": { + "X": -243.64087, + "Y": 20.065613, + "Z": 104.41736 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "IgnoreDistanceToObject": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1001708, + "Position": { + "X": -250.3548, + "Y": 18, + "Z": 80.88806 + }, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 2004889, + "Position": { + "X": -136.55304, + "Y": 11.9782715, + "Z": 23.5141 + }, + "TerritoryId": 130, + "InteractionType": "CompleteQuest", + "NextQuestId": 1574 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/243_A Qiqirn Always Pays His Debts.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/243_A Qiqirn Always Pays His Debts.json new file mode 100644 index 000000000..d7d94ea48 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/243_A Qiqirn Always Pays His Debts.json @@ -0,0 +1,194 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001787, + "Position": { + "X": -62.119568, + "Y": 18.000334, + "Z": 9.414734 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -339.63614, + "Y": -2.097362, + "Z": 142.24135 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Upper La Noscea - Camp Bronze Lake", + "Fly": true + }, + { + "DataId": 1005249, + "Position": { + "X": -337.30072, + "Y": -2.1811728, + "Z": 141.31372 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1003586, + "Position": { + "X": -342.12262, + "Y": -1.0249884, + "Z": 111.46704 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "TargetTerritoryId": 139 + }, + { + "DataId": 1010434, + "Position": { + "X": 241.74866, + "Y": -0.96623325, + "Z": 257.12976 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1010435, + "Position": { + "X": 340.04736, + "Y": -2.5074248, + "Z": 104.600464 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1010435, + "Position": { + "X": 340.04736, + "Y": -2.5074248, + "Z": 104.600464 + }, + "TerritoryId": 139, + "InteractionType": "Combat", + "EnemySpawnType": "FinishCombatIfAny", + "KillEnemyDataIds": [ + 3559, + 3560 + ] + }, + { + "DataId": 1010437, + "Position": { + "X": 271.59534, + "Y": 25.732939, + "Z": -100.35864 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": -339.63614, + "Y": -2.097362, + "Z": 142.24135 + }, + "TerritoryId": 139, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1005249, + "Position": { + "X": -337.30072, + "Y": -2.1811728, + "Z": 141.31372 + }, + "TerritoryId": 139, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1003586, + "Position": { + "X": -342.12262, + "Y": -1.0249884, + "Z": 111.46704 + }, + "TerritoryId": 139, + "InteractionType": "Interact", + "TargetTerritoryId": 139 + }, + { + "DataId": 1010438, + "Position": { + "X": 275.28796, + "Y": -0.93098116, + "Z": 231.61658 + }, + "TerritoryId": 139, + "InteractionType": "CompleteQuest", + "Fly": true, + "NextQuestId": 244 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/244_The Hazy Professor.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/244_The Hazy Professor.json new file mode 100644 index 000000000..2f8cf96e7 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/244_The Hazy Professor.json @@ -0,0 +1,230 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006493, + "Position": { + "X": -437.67456, + "Y": -55.694504, + "Z": 100.87732 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2004864, + "Position": { + "X": -381.70447, + "Y": -58.42682, + "Z": 167.74243 + }, + "TerritoryId": 145, + "InteractionType": "UseItem", + "ItemId": 2001487 + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -393.1081, + "Y": -57.326912, + "Z": 155.15263 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "DataId": 2004877, + "Position": { + "X": -299.48883, + "Y": -40.665344, + "Z": 7.095398 + }, + "TerritoryId": 145, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -422.0606, + "Y": -55.802967, + "Z": 107.502235 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Fly": true + }, + { + + "DataId": 1006493, + "Position": { + "X": -437.67456, + "Y": -55.694504, + "Z": 100.87732 + }, + "TerritoryId": 145, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2004866, + "Position": { + "X": -382.22327, + "Y": -58.42682, + "Z": 168.65796 + }, + "TerritoryId": 145, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": -393.1081, + "Y": -57.326912, + "Z": 155.15263 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "Position": { + "X": -1.83288, + "Y": -17.544205, + "Z": 23.35826 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1006495, + "Position": { + "X": -2.2736206, + "Y": -17.544205, + "Z": 24.734863 + }, + "TerritoryId": 145, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "Position": { + "X": -1.4535733, + "Y": -8.0592985, + "Z": 1.7329537 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "Position": { + "X": 435.9292, + "Y": 9.87471, + "Z": 143.03693 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 2004868, + "Position": { + "X": 438.6206, + "Y": 12.436096, + "Z": 137.6211 + }, + "TerritoryId": 145, + "InteractionType": "UseItem", + "ItemId": 2001489 + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 2004869, + "Position": { + "X": 438.6206, + "Y": 12.436096, + "Z": 137.6211 + }, + "TerritoryId": 145, + "InteractionType": "UseItem", + "ItemId": 2001488 + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1010377, + "Position": { + "X": -382.83362, + "Y": -59.300003, + "Z": 169.75659 + }, + "TerritoryId": 145, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Eastern Thanalan - Camp Drybone", + "NextQuestId": 240 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/362_The Little Postmoogle That Could.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/362_The Little Postmoogle That Could.json new file mode 100644 index 000000000..22a26f689 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/362_The Little Postmoogle That Could.json @@ -0,0 +1,217 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -139.04318, + "Y": 8.522301, + "Z": 280.0128 + }, + "TerritoryId": 153, + "InteractionType": "WalkTo", + "AetheryteShortcut": "South Shroud - Camp Tranquil", + "Fly": true + }, + { + "DataId": 1006751, + "Position": { + "X": -139.45221, + "Y": 8.712891, + "Z": 281.69678 + }, + "TerritoryId": 153, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1010813, + "Position": { + "X": 218.92114, + "Y": 10.293846, + "Z": -75.12018 + }, + "TerritoryId": 153, + "InteractionType": "Emote", + "Emote": "rally", + "AetheryteShortcut": "South Shroud - Quarrymill" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1010814, + "Position": { + "X": -47.837036, + "Y": 3.0947418, + "Z": -44.663208 + }, + "TerritoryId": 153, + "InteractionType": "Emote", + "Emote": "cheer", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -166.19086, + "Y": 8.399985, + "Z": -64.10584 + }, + "TerritoryId": 153, + "InteractionType": "WalkTo", + "Fly": true, + "$": "Buscarron SE steps" + }, + { + "DataId": 1010815, + "Position": { + "X": -168.26129, + "Y": 9.869229, + "Z": -79.54535 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST030_00362_Q1_000_000", + "Answer": "TEXT_SUBPST030_00362_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1010816, + "Position": { + "X": 22.079773, + "Y": -19.000006, + "Z": 106.1875 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Airship Landing" + ] + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1000106, + "Position": { + "X": 29.007324, + "Y": -19.000002, + "Z": 105.485596 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "TargetTerritoryId": 128 + }, + { + "DataId": 1010818, + "Position": { + "X": -13.01593, + "Y": 91.5, + "Z": -18.234558 + }, + "TerritoryId": 128, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1003583, + "Position": { + "X": -7.248047, + "Y": 91.49999, + "Z": -16.128845 + }, + "StopDistance": 7, + "TerritoryId": 128, + "InteractionType": "Interact", + "TargetTerritoryId": 128 + }, + { + "DataId": 1010819, + "Position": { + "X": 17.013733, + "Y": 40.216007, + "Z": -3.8605957 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST030_00362_Q2_000_000", + "Answer": "TEXT_SUBPST030_00362_A2_000_001" + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1010822, + "Position": { + "X": -209.88788, + "Y": 54.829185, + "Z": -196.03265 + }, + "TerritoryId": 152, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "East Shroud - Hawthorne Hut", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/496_Better Left Unfound.json b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/496_Better Left Unfound.json new file mode 100644 index 000000000..4cca30c37 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Stories/Delivery Moogle Quests/496_Better Left Unfound.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1009153, + "Position": { + "X": -39.108948, + "Y": 20, + "Z": 5.416931 + }, + "TerritoryId": 129, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006279, + "Position": { + "X": -231.4336, + "Y": 21.512743, + "Z": 339.49792 + }, + "TerritoryId": 153, + "InteractionType": "Interact", + "AetheryteShortcut": "South Shroud - Camp Tranquil" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1011650, + "Position": { + "X": 557.6714, + "Y": 20.721313, + "Z": 454.24573 + }, + "TerritoryId": 137, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1011650, + "Position": { + "X": 557.6714, + "Y": 20.721313, + "Z": 454.24573 + }, + "TerritoryId": 137, + "InteractionType": "Emote", + "Emote": "soothe" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1011651, + "Position": { + "X": 8.804443, + "Y": 71.18964, + "Z": -15.182739 + }, + "TerritoryId": 137, + "InteractionType": "Interact", + "AetheryteShortcut": "Eastern La Noscea - Wineport", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_SUBPST026_00496_Q1_000_000", + "Answer": "TEXT_SUBPST026_00496_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1011652, + "Position": { + "X": 532.9823, + "Y": 44.02837, + "Z": 540.3982 + }, + "TerritoryId": 137, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Eastern La Noscea - Costa Del Sol", + "Fly": true, + "NextQuestId": 362 + } + ] + } + ] +} diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index d44f1e52b..ace8ed3cf 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -561,9 +561,17 @@ internal sealed unsafe class QuestFunctions if (questInfo.AlliedSociety != EAlliedSociety.None && questInfo.IsRepeatable) return !IsDailyAlliedSocietyQuestAndAvailableToday(questId); - if (questInfo.MoogleDeliveryLevel > 0 && - questInfo.MoogleDeliveryLevel > PlayerState.Instance()->DeliveryLevel) - return true; + if (questInfo.IsMoogleDeliveryQuest) + { + byte currentDeliveryLevel = PlayerState.Instance()->DeliveryLevel; + if (extraCompletedQuest != null && + _questData.TryGetQuestInfo(extraCompletedQuest, out IQuestInfo? extraQuestInfo) && + extraQuestInfo is QuestInfo { IsMoogleDeliveryQuest: true }) + currentDeliveryLevel++; + + if (questInfo.MoogleDeliveryLevel > currentDeliveryLevel) + return true; + } return !HasCompletedPreviousQuests(questInfo, extraCompletedQuest) || !HasCompletedPreviousInstances(questInfo); } diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index 03d1088c2..e34c16d7a 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -104,6 +104,7 @@ internal sealed class QuestInfo : IQuestInfo public uint NewGamePlusChapter { get; } public byte StartingCity { get; set; } public byte MoogleDeliveryLevel { get; } + public bool IsMoogleDeliveryQuest => JournalGenre == 87; public EExpansionVersion Expansion { get; } public void AddPreviousQuest(PreviousQuestInfo questId) From 1578c5d197c9fd0a86815e4d45aa8f0b4a107c73 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 27 Dec 2024 17:48:14 +0100 Subject: [PATCH 040/109] Add Wrath Combo as combat module --- Questionable/Configuration.cs | 5 +- Questionable/Controller/CombatController.cs | 64 ++++++++- .../Controller/CombatModules/BossModModule.cs | 46 ------- .../Controller/CombatModules/ICombatModule.cs | 2 - .../Controller/CombatModules/ItemUseModule.cs | 2 - .../CombatModules/Mount128Module.cs | 12 +- .../CombatModules/Mount147Module.cs | 11 +- .../RotationSolverRebornModule.cs | 46 +------ .../CombatModules/WrathComboModule.cs | 123 ++++++++++++++++++ Questionable/QuestionablePlugin.cs | 2 +- Questionable/Windows/ConfigWindow.cs | 2 +- Questionable/Windows/OneTimeSetupWindow.cs | 9 ++ 12 files changed, 203 insertions(+), 121 deletions(-) create mode 100644 Questionable/Controller/CombatModules/WrathComboModule.cs diff --git a/Questionable/Configuration.cs b/Questionable/Configuration.cs index ce4c96165..b4eb5a5b8 100644 --- a/Questionable/Configuration.cs +++ b/Questionable/Configuration.cs @@ -7,7 +7,7 @@ namespace Questionable; internal sealed class Configuration : IPluginConfiguration { - public const int PluginSetupVersion = 3; + public const int PluginSetupVersion = 4; public int Version { get; set; } = 1; public int PluginSetupCompleteVersion { get; set; } @@ -23,7 +23,7 @@ internal sealed class Configuration : IPluginConfiguration internal sealed class GeneralConfiguration { - public ECombatModule CombatModule { get; set; } = ECombatModule.BossMod; + public ECombatModule CombatModule { get; set; } = ECombatModule.None; public uint MountId { get; set; } = 71; public GrandCompany GrandCompany { get; set; } = GrandCompany.None; public bool HideInAllInstances { get; set; } = true; @@ -51,6 +51,7 @@ internal sealed class Configuration : IPluginConfiguration { None, BossMod, + WrathCombo, RotationSolverReborn, } } diff --git a/Questionable/Controller/CombatController.cs b/Questionable/Controller/CombatController.cs index d7ca7fde7..f44c4934d 100644 --- a/Questionable/Controller/CombatController.cs +++ b/Questionable/Controller/CombatController.cs @@ -13,8 +13,10 @@ using FFXIVClientStructs.FFXIV.Client.Game.UI; using FFXIVClientStructs.FFXIV.Common.Math; using Microsoft.Extensions.Logging; using Questionable.Controller.CombatModules; +using Questionable.Controller.Steps; using Questionable.Controller.Utils; using Questionable.Functions; +using Questionable.Model; using Questionable.Model.Questing; namespace Questionable.Controller; @@ -75,6 +77,7 @@ internal sealed class CombatController : IDisposable { Module = combatModule, Data = combatData, + LastDistanceCheck = DateTime.Now, }; _wasInCombat = combatData.SpawnType is EEnemySpawnType.QuestInterruption or EEnemySpawnType.FinishCombatIfAny; return true; @@ -129,7 +132,18 @@ internal sealed class CombatController : IDisposable if (nextTarget != null && nextTarget.Equals(target)) { - _currentFight.Module.Update(target); + if (!IsMovingOrShouldMove(target)) + { + try + { + _currentFight.Module.Update(target); + } + catch (TaskException e) + { + _logger.LogWarning(e, "Combat was interrupted, stopping: {Exception}", e.Message); + SetTarget(null); + } + } } else if (nextTarget != null) { @@ -323,14 +337,57 @@ internal sealed class CombatController : IDisposable { _logger.LogInformation("Moving to target, distance: {Distance:N2}", Vector3.Distance(_clientState.LocalPlayer!.Position, target.Position)); - _currentFight!.Module.MoveToTarget(target); + MoveToTarget(target); } else { _logger.LogInformation("Setting target to {TargetName} ({TargetId:X8})", target.Name.ToString(), target.GameObjectId); _targetManager.Target = target; - _currentFight!.Module.MoveToTarget(target); + MoveToTarget(target); + } + } + + private bool IsMovingOrShouldMove(IGameObject gameObject) + { + if (_movementController.IsPathfinding || _movementController.IsPathRunning) + return true; + + if (DateTime.Now > _currentFight!.LastDistanceCheck.AddSeconds(10)) + { + MoveToTarget(gameObject); + _currentFight!.LastDistanceCheck = DateTime.Now; + return true; + } + + return false; + } + + private void MoveToTarget(IGameObject gameObject) + { + var player = _clientState.LocalPlayer; + if (player == null) + return; // uh oh + + float hitboxOffset = player.HitboxRadius + gameObject.HitboxRadius; + float actualDistance = Vector3.Distance(player.Position, gameObject.Position); + float maxDistance = player.ClassJob.ValueNullable?.Role is 3 or 4 ? 20f : 2.9f; + if (actualDistance - hitboxOffset >= maxDistance) + { + if (actualDistance - hitboxOffset <= 5) + { + _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack", gameObject.Name, + gameObject.DataId); + _movementController.NavigateTo(EMovementType.Combat, null, [gameObject.Position], false, false, + maxDistance + hitboxOffset - 0.25f, true); + } + else + { + _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack (with navmesh)", gameObject.Name, + gameObject.DataId); + _movementController.NavigateTo(EMovementType.Combat, null, gameObject.Position, false, false, + maxDistance + hitboxOffset - 0.25f, true); + } } } @@ -359,6 +416,7 @@ internal sealed class CombatController : IDisposable { public required ICombatModule Module { get; init; } public required CombatData Data { get; init; } + public required DateTime LastDistanceCheck { get; set; } } public sealed class CombatData diff --git a/Questionable/Controller/CombatModules/BossModModule.cs b/Questionable/Controller/CombatModules/BossModModule.cs index f27a6f810..ee25967f4 100644 --- a/Questionable/Controller/CombatModules/BossModModule.cs +++ b/Questionable/Controller/CombatModules/BossModModule.cs @@ -16,8 +16,6 @@ internal sealed class BossModModule : ICombatModule, IDisposable { private const string Name = "BossMod"; private readonly ILogger _logger; - private readonly MovementController _movementController; - private readonly IClientState _clientState; private readonly Configuration _configuration; private readonly ICallGateSubscriber _getPreset; private readonly ICallGateSubscriber _createPreset; @@ -25,18 +23,13 @@ internal sealed class BossModModule : ICombatModule, IDisposable private readonly ICallGateSubscriber _clearPreset; private static Stream Preset => typeof(BossModModule).Assembly.GetManifestResourceStream("Questionable.Controller.CombatModules.BossModPreset")!; - private DateTime _lastDistanceCheck = DateTime.MinValue; public BossModModule( ILogger logger, - MovementController movementController, - IClientState clientState, IDalamudPluginInterface pluginInterface, Configuration configuration) { _logger = logger; - _movementController = movementController; - _clientState = clientState; _configuration = configuration; _getPreset = pluginInterface.GetIpcSubscriber($"{Name}.Presets.Get"); @@ -70,7 +63,6 @@ internal sealed class BossModModule : ICombatModule, IDisposable _logger.LogInformation("Loading Questionable BossMod Preset: {LoadedState}", _createPreset.InvokeFunc(reader.ReadToEnd(), true)); } _setPreset.InvokeFunc("Questionable"); - _lastDistanceCheck = DateTime.Now; return true; } catch (IpcError e) @@ -94,46 +86,8 @@ internal sealed class BossModModule : ICombatModule, IDisposable } } - public void MoveToTarget(IGameObject gameObject) - { - var player = _clientState.LocalPlayer; - if (player == null) - return; // uh oh - - float hitboxOffset = player.HitboxRadius + gameObject.HitboxRadius; - float actualDistance = Vector3.Distance(player.Position, gameObject.Position); - float maxDistance = player.ClassJob.ValueNullable?.Role is 3 or 4 ? 20f : 2.9f; - if (actualDistance - hitboxOffset >= maxDistance) - { - if (actualDistance - hitboxOffset <= 5) - { - _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack", gameObject.Name, - gameObject.DataId); - _movementController.NavigateTo(EMovementType.Combat, null, [gameObject.Position], false, false, - maxDistance + hitboxOffset - 0.25f, true); - } - else - { - _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack (with navmesh)", gameObject.Name, - gameObject.DataId); - _movementController.NavigateTo(EMovementType.Combat, null, gameObject.Position, false, false, - maxDistance + hitboxOffset - 0.25f, true); - } - } - - _lastDistanceCheck = DateTime.Now; - } - public void Update(IGameObject gameObject) { - if (_movementController.IsPathfinding || _movementController.IsPathRunning) - return; - - if (DateTime.Now > _lastDistanceCheck.AddSeconds(10)) - { - MoveToTarget(gameObject); - _lastDistanceCheck = DateTime.Now; - } } public bool CanAttack(IBattleNpc target) => true; diff --git a/Questionable/Controller/CombatModules/ICombatModule.cs b/Questionable/Controller/CombatModules/ICombatModule.cs index 06fe4ae68..2a295ae03 100644 --- a/Questionable/Controller/CombatModules/ICombatModule.cs +++ b/Questionable/Controller/CombatModules/ICombatModule.cs @@ -12,7 +12,5 @@ internal interface ICombatModule void Update(IGameObject nextTarget); - void MoveToTarget(IGameObject nextTarget); - bool CanAttack(IBattleNpc target); } diff --git a/Questionable/Controller/CombatModules/ItemUseModule.cs b/Questionable/Controller/CombatModules/ItemUseModule.cs index 65f829a17..26a92ff32 100644 --- a/Questionable/Controller/CombatModules/ItemUseModule.cs +++ b/Questionable/Controller/CombatModules/ItemUseModule.cs @@ -152,7 +152,5 @@ internal sealed class ItemUseModule : ICombatModule return false; } - public void MoveToTarget(IGameObject nextTarget) => _delegate!.MoveToTarget(nextTarget); - public bool CanAttack(IBattleNpc target) => _delegate!.CanAttack(target); } diff --git a/Questionable/Controller/CombatModules/Mount128Module.cs b/Questionable/Controller/CombatModules/Mount128Module.cs index e665163a0..9f8859639 100644 --- a/Questionable/Controller/CombatModules/Mount128Module.cs +++ b/Questionable/Controller/CombatModules/Mount128Module.cs @@ -15,13 +15,10 @@ internal sealed class Mount128Module : ICombatModule public const ushort MountId = 128; private readonly EAction[] _actions = [EAction.MagitekThunder, EAction.MagitekPulse]; - private readonly MovementController _movementController; private readonly GameFunctions _gameFunctions; - - public Mount128Module(MovementController movementController, GameFunctions gameFunctions) + public Mount128Module(GameFunctions gameFunctions) { - _movementController = movementController; _gameFunctions = gameFunctions; } @@ -33,9 +30,6 @@ internal sealed class Mount128Module : ICombatModule public void Update(IGameObject gameObject) { - if (_movementController.IsPathfinding || _movementController.IsPathRunning) - return; - foreach (EAction action in _actions) { if (_gameFunctions.UseAction(gameObject, action, checkCanUse: false)) @@ -43,9 +37,5 @@ internal sealed class Mount128Module : ICombatModule } } - public void MoveToTarget(IGameObject gameObject) - { - } - public bool CanAttack(IBattleNpc target) => target.DataId is 7504 or 7505 or 14107; } diff --git a/Questionable/Controller/CombatModules/Mount147Module.cs b/Questionable/Controller/CombatModules/Mount147Module.cs index f0c43176d..4d8202fcc 100644 --- a/Questionable/Controller/CombatModules/Mount147Module.cs +++ b/Questionable/Controller/CombatModules/Mount147Module.cs @@ -15,13 +15,11 @@ internal sealed class Mount147Module : ICombatModule public const ushort MountId = 147; private readonly EAction[] _actions = [EAction.Trample]; - private readonly MovementController _movementController; private readonly GameFunctions _gameFunctions; - public Mount147Module(MovementController movementController, GameFunctions gameFunctions) + public Mount147Module(GameFunctions gameFunctions) { - _movementController = movementController; _gameFunctions = gameFunctions; } @@ -33,9 +31,6 @@ internal sealed class Mount147Module : ICombatModule public void Update(IGameObject gameObject) { - if (_movementController.IsPathfinding || _movementController.IsPathRunning) - return; - foreach (EAction action in _actions) { if (_gameFunctions.UseAction(gameObject, action, checkCanUse: false)) @@ -43,9 +38,5 @@ internal sealed class Mount147Module : ICombatModule } } - public void MoveToTarget(IGameObject gameObject) - { - } - public bool CanAttack(IBattleNpc target) => target.DataId is 8593; } diff --git a/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs b/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs index d5f13f4ef..f89ad334d 100644 --- a/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs +++ b/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs @@ -14,19 +14,15 @@ namespace Questionable.Controller.CombatModules; internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable { private readonly ILogger _logger; - private readonly MovementController _movementController; private readonly IClientState _clientState; private readonly Configuration _configuration; private readonly ICallGateSubscriber _test; private readonly ICallGateSubscriber _changeOperationMode; - private DateTime _lastDistanceCheck = DateTime.MinValue; - public RotationSolverRebornModule(ILogger logger, MovementController movementController, IClientState clientState, IDalamudPluginInterface pluginInterface, Configuration configuration) { _logger = logger; - _movementController = movementController; _clientState = clientState; _configuration = configuration; _test = pluginInterface.GetIpcSubscriber("RotationSolverReborn.Test"); @@ -55,7 +51,6 @@ internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable try { _changeOperationMode.InvokeAction(StateCommandType.Manual); - _lastDistanceCheck = DateTime.Now; return true; } catch (IpcError e) @@ -67,6 +62,9 @@ internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable public bool Stop() { + if (!_changeOperationMode.HasAction) + return true; + try { _changeOperationMode.InvokeAction(StateCommandType.Off); @@ -79,46 +77,8 @@ internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable } } - public void MoveToTarget(IGameObject gameObject) - { - var player = _clientState.LocalPlayer; - if (player == null) - return; // uh oh - - float hitboxOffset = player.HitboxRadius + gameObject.HitboxRadius; - float actualDistance = Vector3.Distance(player.Position, gameObject.Position); - float maxDistance = player.ClassJob.ValueNullable?.Role is 3 or 4 ? 20f : 2.9f; - if (actualDistance - hitboxOffset >= maxDistance) - { - if (actualDistance - hitboxOffset <= 5) - { - _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack", gameObject.Name, - gameObject.DataId); - _movementController.NavigateTo(EMovementType.Combat, null, [gameObject.Position], false, false, - maxDistance + hitboxOffset - 0.25f, true); - } - else - { - _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack (with navmesh)", gameObject.Name, - gameObject.DataId); - _movementController.NavigateTo(EMovementType.Combat, null, gameObject.Position, false, false, - maxDistance + hitboxOffset - 0.25f, true); - } - } - - _lastDistanceCheck = DateTime.Now; - } - public void Update(IGameObject gameObject) { - if (_movementController.IsPathfinding || _movementController.IsPathRunning) - return; - - if (DateTime.Now > _lastDistanceCheck.AddSeconds(10)) - { - MoveToTarget(gameObject); - _lastDistanceCheck = DateTime.Now; - } } public bool CanAttack(IBattleNpc target) => true; diff --git a/Questionable/Controller/CombatModules/WrathComboModule.cs b/Questionable/Controller/CombatModules/WrathComboModule.cs new file mode 100644 index 000000000..d9563683a --- /dev/null +++ b/Questionable/Controller/CombatModules/WrathComboModule.cs @@ -0,0 +1,123 @@ +using System; +using Dalamud.Game.ClientState.Objects.Types; +using Dalamud.Plugin; +using Dalamud.Plugin.Ipc; +using Dalamud.Plugin.Ipc.Exceptions; +using Microsoft.Extensions.Logging; +using Questionable.Controller.Steps; + +namespace Questionable.Controller.CombatModules; + +internal sealed class WrathComboModule : ICombatModule, IDisposable +{ + private const string CallbackPrefix = "Questionable$Wrath"; + + private readonly ILogger _logger; + private readonly Configuration _configuration; + private readonly ICallGateSubscriber _test; + private readonly ICallGateSubscriber _registerForLeaseWithCallback; + private readonly ICallGateSubscriber _releaseControl; + private readonly ICallGateSubscriber _setAutoRotationState; + private readonly ICallGateSubscriber _setCurrentJobAutoRotationReady; + private readonly ICallGateProvider _callback; + + private Guid? _lease; + + public WrathComboModule(ILogger logger, Configuration configuration, + IDalamudPluginInterface pluginInterface) + { + _logger = logger; + _configuration = configuration; + _test = pluginInterface.GetIpcSubscriber("WrathCombo.Test"); + _registerForLeaseWithCallback = + pluginInterface.GetIpcSubscriber("WrathCombo.RegisterForLeaseWithCallback"); + _releaseControl = pluginInterface.GetIpcSubscriber("WrathCombo.ReleaseControl"); + _setAutoRotationState = pluginInterface.GetIpcSubscriber("WrathCombo.SetAutoRotationState"); + _setCurrentJobAutoRotationReady = + pluginInterface.GetIpcSubscriber("WrathCombo.SetCurrentJobAutoRotationReady"); + + _callback = pluginInterface.GetIpcProvider($"{CallbackPrefix}.WrathComboCallback"); + _callback.RegisterAction(Callback); + } + + public bool CanHandleFight(CombatController.CombatData combatData) + { + if (_configuration.General.CombatModule != Configuration.ECombatModule.WrathCombo) + return false; + + try + { + _test.InvokeAction(); + return true; + } + catch (IpcError) + { + return false; + } + } + + public bool Start(CombatController.CombatData combatData) + { + try + { + _lease = _registerForLeaseWithCallback.InvokeFunc("Questionable", "Questionable", CallbackPrefix); + if (_lease != null) + { + _logger.LogDebug("Wrath combo lease: {Lease}", _lease.Value); + + _setAutoRotationState.InvokeAction(_lease.Value, true); + _setCurrentJobAutoRotationReady.InvokeAction(_lease.Value); + return true; + } + else + { + _logger.LogError("Wrath combo did not return a lease"); + return false; + } + } + catch (IpcError e) + { + _logger.LogError(e, "Unable to use wrath combo for combat"); + return false; + } + } + + public bool Stop() + { + try + { + if (_lease != null) + { + _releaseControl.InvokeAction(_lease.Value); + _lease = null; + } + + return true; + } + catch (IpcError e) + { + _logger.LogWarning(e, "Could not turn off wrath combo"); + return false; + } + } + + public void Update(IGameObject nextTarget) + { + if (_lease == null) + throw new TaskException("Wrath Combo Lease is cancelled"); + } + + public bool CanAttack(IBattleNpc target) => true; + + private void Callback(int reason, string additionalInfo) + { + _logger.LogWarning("WrathCombo callback: {Reason} ({Info})", reason, additionalInfo); + _lease = null; + } + + public void Dispose() + { + Stop(); + _callback.UnregisterAction(); + } +} diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 6c89d5ad5..5964eb45a 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -19,7 +19,6 @@ using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Gathering; using Questionable.Controller.Steps.Interactions; using Questionable.Controller.Steps.Leves; -using Questionable.Controller.Utils; using Questionable.Data; using Questionable.External; using Questionable.Functions; @@ -249,6 +248,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); } diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs index 5184761c5..f44140846 100644 --- a/Questionable/Windows/ConfigWindow.cs +++ b/Questionable/Windows/ConfigWindow.cs @@ -29,7 +29,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig private readonly uint[] _mountIds; private readonly string[] _mountNames; - private readonly string[] _combatModuleNames = ["None", "Boss Mod (VBM)", "Rotation Solver Reborn"]; + private readonly string[] _combatModuleNames = ["None", "Boss Mod (VBM)", "Wrath Combo", "Rotation Solver Reborn"]; private readonly string[] _grandCompanyNames = ["None (manually pick quest)", "Maelstrom", "Twin Adder", "Immortal Flames"]; diff --git a/Questionable/Windows/OneTimeSetupWindow.cs b/Questionable/Windows/OneTimeSetupWindow.cs index 3ba35a096..3db85089d 100644 --- a/Questionable/Windows/OneTimeSetupWindow.cs +++ b/Questionable/Windows/OneTimeSetupWindow.cs @@ -54,6 +54,14 @@ internal sealed class OneTimeSetupWindow : LWindow new Uri("https://github.com/awgil/ffxiv_bossmod"), new Uri("https://puni.sh/api/repository/veyn")) }, + { + Configuration.ECombatModule.WrathCombo, + new PluginInfo("Wrath Combo", + "WrathCombo", + string.Empty, + new Uri("https://github.com/PunishXIV/WrathCombo"), + new Uri("https://puni.sh/api/plugins")) + }, { Configuration.ECombatModule.RotationSolverReborn, new("Rotation Solver Reborn", @@ -143,6 +151,7 @@ internal sealed class OneTimeSetupWindow : LWindow } DrawCombatPlugin(Configuration.ECombatModule.BossMod, checklistPadding); + DrawCombatPlugin(Configuration.ECombatModule.WrathCombo, checklistPadding); DrawCombatPlugin(Configuration.ECombatModule.RotationSolverReborn, checklistPadding); } From cd2d85269baabb9ab609b631f66610c427828984 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 27 Dec 2024 17:48:26 +0100 Subject: [PATCH 041/109] Change log level for automaton IPC --- Questionable/External/AutomatonIpc.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Questionable/External/AutomatonIpc.cs b/Questionable/External/AutomatonIpc.cs index 69e946783..04bbfac79 100644 --- a/Questionable/External/AutomatonIpc.cs +++ b/Questionable/External/AutomatonIpc.cs @@ -15,7 +15,7 @@ internal sealed class AutomatonIpc { _logger = logger; _isTweakEnabled = pluginInterface.GetIpcSubscriber("Automaton.IsTweakEnabled"); - logger.LogWarning("Automaton x {IsTweakEnabled}", IsAutoSnipeEnabled); + logger.LogInformation("Automaton auto-snipe enabled: {IsTweakEnabled}", IsAutoSnipeEnabled); } public bool IsAutoSnipeEnabled From 5f8c16563e2ad214587b0d2b9872d996d03c4249 Mon Sep 17 00:00:00 2001 From: Plogon Enjoyer Date: Sat, 28 Dec 2024 01:22:32 +0800 Subject: [PATCH 042/109] Added new daily quests: - A Stable's Condition - Beat of the Drum - Cannot Say Neigh Also added new gathering points. --- .../The Azim Steppe/544_Onsal Hakair_MIN.json | 61 ++++++++ .../The Azim Steppe/548_Onsal Hakair_BTN.json | 61 ++++++++ .../Dailies/3116_A Stable's Condition.json | 134 ++++++++++++++++++ .../Namazu/Dailies/3117_Beat of the Drum.json | 134 ++++++++++++++++++ .../Namazu/Dailies/3118_Cannot Say Neigh.json | 109 ++++++++++++++ 5 files changed, 499 insertions(+) create mode 100644 GatheringPaths/4.x - Stormblood/The Azim Steppe/544_Onsal Hakair_MIN.json create mode 100644 GatheringPaths/4.x - Stormblood/The Azim Steppe/548_Onsal Hakair_BTN.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3116_A Stable's Condition.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3117_Beat of the Drum.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3118_Cannot Say Neigh.json diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/544_Onsal Hakair_MIN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/544_Onsal Hakair_MIN.json new file mode 100644 index 000000000..d726e1310 --- /dev/null +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/544_Onsal Hakair_MIN.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "plogon_enjoyer", + "Steps": [ + { + "TerritoryId": 622, + "InteractionType": "None", + "AetheryteShortcut": "Azim Steppe - Dawn Throne" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 32323, + "Locations": [ + { + "Position": { + "X": -54.36381, + "Y": 55.83623, + "Z": -357.2043 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32325, + "Locations": [ + { + "Position": { + "X": -56.99122, + "Y": 59.4855, + "Z": -368.9053 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32324, + "Locations": [ + { + "Position": { + "X": -83.84797, + "Y": 60.70433, + "Z": -366.7615 + } + } + ] + } + ] + } + ] +} diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/548_Onsal Hakair_BTN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/548_Onsal Hakair_BTN.json new file mode 100644 index 000000000..ede6b9c62 --- /dev/null +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/548_Onsal Hakair_BTN.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "plogon_enjoyer", + "Steps": [ + { + "TerritoryId": 622, + "InteractionType": "None", + "AetheryteShortcut": "Azim Steppe - Dawn Throne" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 32335, + "Locations": [ + { + "Position": { + "X": -80.14488, + "Y": 58.18221, + "Z": -358.3333 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32336, + "Locations": [ + { + "Position": { + "X": -58.9046, + "Y": 52.59887, + "Z": -350.7942 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32337, + "Locations": [ + { + "Position": { + "X": -81.5958, + "Y": 51.05495, + "Z": -334.9854 + } + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3116_A Stable's Condition.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3116_A Stable's Condition.json new file mode 100644 index 000000000..ea6dcd9b1 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3116_A Stable's Condition.json @@ -0,0 +1,134 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "plogon_enjoyer", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025925, + "Position": { + "X": -702.17444, + "Y": 127.5686, + "Z": 112.291016 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "TargetTerritoryId": 622, + "Mount": true + }, + { + "DataId": 1025797, + "Position": { + "X": -364.7975, + "Y": 76.98169, + "Z": -579.2172 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Mount": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025798, + "Position": { + "X": -366.2318, + "Y": 76.98169, + "Z": -580.31586 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": ["DoH"] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22736, + "ItemCount": 2, + "RequiredQuestAcceptedJob": ["DoH"] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22632, + "ItemCount": 1 + } + ], + "RequiredQuestAcceptedJob": ["Miner"] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22658, + "ItemCount": 1 + } + ], + "RequiredQuestAcceptedJob": ["Botanist"] + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3117_Beat of the Drum.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3117_Beat of the Drum.json new file mode 100644 index 000000000..4e6927c0c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3117_Beat of the Drum.json @@ -0,0 +1,134 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "plogon_enjoyer", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025925, + "Position": { + "X": -702.17444, + "Y": 127.5686, + "Z": 112.291016 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "TargetTerritoryId": 622, + "Mount": true + }, + { + "DataId": 1025799, + "Position": { + "X": -175.03625, + "Y": 66.81902, + "Z": -437.43042 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Mount": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025800, + "Position": { + "X": -172.74744, + "Y": 67.39905, + "Z": -436.60645 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredCurrentJob": ["DoH"] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22737, + "ItemCount": 1, + "RequiredCurrentJob": ["DoH"] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22633, + "ItemCount": 2 + } + ], + "RequiredQuestAcceptedJob": ["Miner"] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22659, + "ItemCount": 2 + } + ], + "RequiredQuestAcceptedJob": ["Botanist"] + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3118_Cannot Say Neigh.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3118_Cannot Say Neigh.json new file mode 100644 index 000000000..d3c03fa3f --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3118_Cannot Say Neigh.json @@ -0,0 +1,109 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "plogon_enjoyer", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025925, + "Position": { + "X": -702.17444, + "Y": 127.5686, + "Z": 112.291016 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "TargetTerritoryId": 622, + "Mount": true + }, + { + "DataId": 1025801, + "Position": { + "X": -609.49115, + "Y": 41.834953, + "Z": 139.75732 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Mount": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025802, + "Position": { + "X": -232.89844, + "Y": 55.466682, + "Z": -329.15234 + }, + "TerritoryId": 622, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} From 95d19455de435359a8b6d856893811c732ff5657 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 27 Dec 2024 18:25:59 +0100 Subject: [PATCH 043/109] Adjust filter logic --- Questionable/Data/JournalData.cs | 38 ++--- .../QuestJournalComponent.cs | 149 +++++++++--------- .../JournalComponents/QuestJournalUtils.cs | 20 +-- 3 files changed, 94 insertions(+), 113 deletions(-) diff --git a/Questionable/Data/JournalData.cs b/Questionable/Data/JournalData.cs index 52f37e22e..c2983fe56 100644 --- a/Questionable/Data/JournalData.cs +++ b/Questionable/Data/JournalData.cs @@ -10,44 +10,30 @@ namespace Questionable.Data; internal sealed class JournalData { - private readonly IDataManager _dataManager; - private readonly QuestData _questData; public JournalData(IDataManager dataManager, QuestData questData) { - _dataManager = dataManager; - _questData = questData; - - Reload(); - } - - public List Genres { get; set; } - public List Categories { get; set; } - public List
Sections { get; set; } - - public void Reload() - { - var genres = _dataManager.GetExcelSheet() + var genres = dataManager.GetExcelSheet() .Where(x => x.RowId > 0 && x.Icon > 0) - .Select(x => new Genre(x, _questData.GetAllByJournalGenre(x.RowId))) + .Select(x => new Genre(x, questData.GetAllByJournalGenre(x.RowId))) .ToList(); - var limsaStart = _dataManager.GetExcelSheet().GetRow(1); - var gridaniaStart = _dataManager.GetExcelSheet().GetRow(2); - var uldahStart = _dataManager.GetExcelSheet().GetRow(3); + var limsaStart = dataManager.GetExcelSheet().GetRow(1); + var gridaniaStart = dataManager.GetExcelSheet().GetRow(2); + var uldahStart = dataManager.GetExcelSheet().GetRow(3); var genreLimsa = new Genre(uint.MaxValue - 3, "Starting in Limsa Lominsa", 1, new uint[] { 108, 109 }.Concat(limsaStart.QuestRedoParam.Select(x => x.Quest.RowId)) .Where(x => x != 0) - .Select(x => _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.QuestRedoParam.Select(x => x.Quest.RowId)) .Where(x => x != 0) - .Select(x => _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.QuestRedoParam.Select(x => x.Quest.RowId)) .Where(x => x != 0) - .Select(x => _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) @@ -56,15 +42,19 @@ internal sealed class JournalData genreLimsa.Quests.Contains(x) || genreGridania.Quests.Contains(x) || genreUldah.Quests.Contains(x)); Genres = genres.ToList(); - Categories = _dataManager.GetExcelSheet() + Categories = dataManager.GetExcelSheet() .Where(x => x.RowId > 0) .Select(x => new Category(x, Genres.Where(y => y.CategoryId == x.RowId).ToList())) .ToList(); - Sections = _dataManager.GetExcelSheet() + Sections = dataManager.GetExcelSheet() .Select(x => new Section(x, Categories.Where(y => y.SectionId == x.RowId).ToList())) .ToList(); } + public List Genres { get; } + public List Categories { get; } + public List
Sections { get; } + internal sealed class Genre { public Genre(JournalGenre journalGenre, List quests) diff --git a/Questionable/Windows/JournalComponents/QuestJournalComponent.cs b/Questionable/Windows/JournalComponents/QuestJournalComponent.cs index de5a7bb88..437591ff8 100644 --- a/Questionable/Windows/JournalComponents/QuestJournalComponent.cs +++ b/Questionable/Windows/JournalComponents/QuestJournalComponent.cs @@ -31,14 +31,12 @@ internal sealed class QuestJournalComponent private readonly IDalamudPluginInterface _pluginInterface; private readonly QuestJournalUtils _questJournalUtils; private readonly QuestValidator _questValidator; - private readonly IPluginLog _log; private List _filteredSections = []; - private string _searchText = string.Empty; public QuestJournalComponent(JournalData journalData, QuestRegistry questRegistry, QuestFunctions questFunctions, UiUtils uiUtils, QuestTooltipComponent questTooltipComponent, IDalamudPluginInterface pluginInterface, - QuestJournalUtils questJournalUtils, QuestValidator questValidator, IPluginLog log) + QuestJournalUtils questJournalUtils, QuestValidator questValidator) { _journalData = journalData; _questRegistry = questRegistry; @@ -48,9 +46,10 @@ internal sealed class QuestJournalComponent _pluginInterface = pluginInterface; _questJournalUtils = questJournalUtils; _questValidator = questValidator; - _log = log; } + internal FilterConfiguration Filter { get; } = new(); + public void DrawQuests() { using var tab = ImRaii.TabItem("Quests"); @@ -74,7 +73,7 @@ internal sealed class QuestJournalComponent ImGui.SameLine(); ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X); - if (ImGui.InputTextWithHint(string.Empty, "Search quests and categories", ref _searchText, 256)) + if (ImGui.InputTextWithHint(string.Empty, "Search quests and categories", ref Filter.SearchText, 256)) UpdateFilter(); if (_filteredSections.Count > 0) @@ -92,7 +91,7 @@ internal sealed class QuestJournalComponent DrawSection(section); } else - ImGui.Text("No quest or category matches your search text."); + ImGui.Text("No quest or category matches your search."); } private void DrawSection(FilteredSection filter) @@ -239,104 +238,63 @@ internal sealed class QuestJournalComponent public void UpdateFilter() { - _journalData.Reload(); - Predicate match = string.IsNullOrWhiteSpace(_searchText) ? x => true : x => x.Contains(_searchText, StringComparison.CurrentCultureIgnoreCase); - _filteredSections = _journalData.Sections - .Select(section => FilterSection(section, match)) - .Where(x => x != null) - .Cast() + .Select(x => FilterSection(x, Filter)) + .Where(x => x.Categories.Count > 0) .ToList(); - for (int i = 0; i < _filteredSections.Count; i++) - { - var section = _filteredSections[i]; - for (int s = 0; s < section.Categories.Count; s++) - { - var category = section.Categories[s]; - for (int c = 0; c < category.Genres.Count; c++) - { - var genre = category.Genres[c]; - for (int g = 0; g < genre.Quests.Count; g++) - { - var quest = genre.Quests[g]; - - //All Quest Filter conditions checked here, cause we just love IEnumerable - if (QuestJournalUtils.AvailableOnly && !_questFunctions.IsReadyToAcceptQuest(quest.QuestId) || - QuestJournalUtils.HideNoPaths && !_questRegistry.TryGetQuest(quest.QuestId, out _)) - { - genre.Quests.Remove(quest); - g--; - } - } - } - } - } - RefreshCounts(); } - private static FilteredSection? FilterSection(JournalData.Section section, Predicate match) + private FilteredSection FilterSection(JournalData.Section section, FilterConfiguration filter) { - if (match(section.Name)) + IEnumerable filteredCategories; + if (IsCategorySectionGenreMatch(filter, section.Name)) { - return new FilteredSection(section, - section.Categories - .Select(x => FilterCategory(x, _ => true)) - .Cast() - .ToList()); + filteredCategories = section.Categories + .Select(x => FilterCategory(x, filter.WithoutName())); } else { - List filteredCategories = section.Categories - .Select(category => FilterCategory(category, match)) - .Where(x => x != null) - .Cast() - .ToList(); - if (filteredCategories.Count > 0) - return new FilteredSection(section, filteredCategories); - - return null; + filteredCategories = section.Categories + .Select(category => FilterCategory(category, filter)); } + + return new FilteredSection(section, filteredCategories.Where(x => x.Genres.Count > 0).ToList()); } - private static FilteredCategory? FilterCategory(JournalData.Category category, Predicate match) + private FilteredCategory FilterCategory(JournalData.Category category, FilterConfiguration filter) { - if (match(category.Name)) + IEnumerable filteredGenres; + if (IsCategorySectionGenreMatch(filter, category.Name)) { - return new FilteredCategory(category, - category.Genres - .Select(x => FilterGenre(x, _ => true)!) - .ToList()); + filteredGenres = category.Genres + .Select(x => FilterGenre(x, filter.WithoutName())); } else { - List filteredGenres = category.Genres - .Select(genre => FilterGenre(genre, match)) - .Where(x => x != null) - .Cast() - .ToList(); - if (filteredGenres.Count > 0) - return new FilteredCategory(category, filteredGenres); - - return null; + filteredGenres = category.Genres + .Select(genre => FilterGenre(genre, filter)); } + + return new FilteredCategory(category, filteredGenres.Where(x => x.Quests.Count > 0).ToList()); } - private static FilteredGenre? FilterGenre(JournalData.Genre genre, Predicate match) + private FilteredGenre FilterGenre(JournalData.Genre genre, FilterConfiguration filter) { - if (match(genre.Name)) - return new FilteredGenre(genre, genre.Quests); + IEnumerable filteredQuests; + if (IsCategorySectionGenreMatch(filter, genre.Name)) + { + filteredQuests = genre.Quests + .Where(x => IsQuestMatch(filter.WithoutName(), x)); + } else { - List filteredQuests = genre.Quests - .Where(x => match(x.Name)) - .ToList(); - if (filteredQuests.Count > 0) - return new FilteredGenre(genre, filteredQuests); + filteredQuests = genre.Quests + .Where(x => IsQuestMatch(filter, x)); } - return null; + return new FilteredGenre(genre, filteredQuests.ToList()); } internal void RefreshCounts() @@ -396,6 +354,28 @@ internal sealed class QuestJournalComponent _sectionCounts[sectionCount.Key] = sectionCount.Value with { Completed = 0 }; } + private static bool IsCategorySectionGenreMatch(FilterConfiguration filter, string name) + { + return string.IsNullOrEmpty(filter.SearchText) || + name.Contains(filter.SearchText, StringComparison.CurrentCultureIgnoreCase); + } + + private bool IsQuestMatch(FilterConfiguration filter, IQuestInfo questInfo) + { + if (!string.IsNullOrEmpty(filter.SearchText) && + !questInfo.Name.Contains(filter.SearchText, StringComparison.CurrentCultureIgnoreCase)) + return false; + + if (filter.AvailableOnly && !_questFunctions.IsReadyToAcceptQuest(questInfo.QuestId)) + return false; + + if (filter.HideNoPaths && + (!_questRegistry.TryGetQuest(questInfo.QuestId, out var quest) || quest.Root.Disabled)) + return false; + + return true; + } + private sealed record FilteredSection(JournalData.Section Section, List Categories); private sealed record FilteredCategory(JournalData.Category Category, List Genres); @@ -409,4 +389,19 @@ internal sealed class QuestJournalComponent { } } + + internal sealed class FilterConfiguration + { + public string SearchText = string.Empty; + public bool AvailableOnly; + public bool HideNoPaths; + + public bool AdvancedFiltersActive => AvailableOnly || HideNoPaths; + + public FilterConfiguration WithoutName() => new() + { + AvailableOnly = AvailableOnly, + HideNoPaths = HideNoPaths + }; + } } diff --git a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs index 8d43d7f75..906dd9d22 100644 --- a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs +++ b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs @@ -7,6 +7,7 @@ using Questionable.Functions; using Questionable.Model; using Questionable.Model.Questing; using System; +using Dalamud.Interface.Colors; namespace Questionable.Windows.JournalComponents; @@ -16,9 +17,6 @@ internal sealed class QuestJournalUtils private readonly QuestFunctions _questFunctions; private readonly ICommandManager _commandManager; - public static bool AvailableOnly; - public static bool HideNoPaths; - public QuestJournalUtils(QuestController questController, QuestFunctions questFunctions, ICommandManager commandManager) { @@ -50,19 +48,17 @@ internal sealed class QuestJournalUtils } } - internal static void ShowFilterContextMenu(QuestJournalComponent journalUI) + internal static void ShowFilterContextMenu(QuestJournalComponent journalUi) { - if (ImGuiComponents.IconButton(Dalamud.Interface.FontAwesomeIcon.Filter)) - ImGui.OpenPopup($"##QuestFilters"); + if (ImGuiComponents.IconButtonWithText(Dalamud.Interface.FontAwesomeIcon.Filter, "Filter")) + ImGui.OpenPopup("##QuestFilters"); - using var popup = ImRaii.Popup($"##QuestFilters"); + using var popup = ImRaii.Popup("##QuestFilters"); if (!popup) return; - if (ImGui.Checkbox("Show only Available Quests", ref AvailableOnly) || - ImGui.Checkbox("Hide Quests Without Path", ref HideNoPaths)) - journalUI.UpdateFilter(); - - + if (ImGui.Checkbox("Show only Available Quests", ref journalUi.Filter.AvailableOnly) || + ImGui.Checkbox("Hide Quests Without Path", ref journalUi.Filter.HideNoPaths)) + journalUi.UpdateFilter(); } } From 464865d57296d91c4ebce11022978669358c1b4d Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 27 Dec 2024 18:28:10 +0100 Subject: [PATCH 044/109] Version bump --- Directory.Build.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index 5b421e209..e42241fe6 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 4.9 + 4.10 From 59d6bd9d825ffa65fdd6a74bd2c9091902a01c42 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 28 Dec 2024 14:26:22 +0100 Subject: [PATCH 045/109] Fix 'Danger at the Docks' --- .../Side Quests/Kozama'uka/5062_Danger at the Dock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json index bb1114f34..43596202f 100644 --- a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json @@ -23,9 +23,9 @@ { "DataId": 2014196, "Position": { - "X": 728.7556, - "Y": 8.010925, - "Z": -287.95306 + "X": 819.6382, + "Y": 14.084045, + "Z": -312.21484 }, "TerritoryId": 1188, "InteractionType": "Combat", From 37661434a73dc12b69690e5bee5161aa27e7b9a8 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 28 Dec 2024 15:08:12 +0100 Subject: [PATCH 046/109] Unlock Dock Poga during DT MSQ --- .../Kozama'uka/5064_Ripe for the Offering.json | 15 +++++++++++++-- .../4869_The Lifting of Wings.json | 5 +++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json b/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json index e832b2717..a16039f32 100644 --- a/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json +++ b/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json @@ -87,7 +87,12 @@ }, "TerritoryId": 1188, "InteractionType": "WalkTo", - "Comment": "Waypoint after swimming through the river" + "Comment": "Waypoint after swimming through the river", + "SkipConditions": { + "StepIf": { + "AetheryteUnlocked": "Kozama'uka - Dock Poga" + } + } }, { "DataId": 2013938, @@ -98,7 +103,13 @@ }, "TerritoryId": 1188, "InteractionType": "AttuneAetherCurrent", - "AetherCurrentId": 2818425 + "AetherCurrentId": 2818425, + "AetheryteShortcut": "Kozama'uka - Dock Poga", + "SkipConditions": { + "AetheryteShortcutIf": { + "AetheryteLocked": "Kozama'uka - Dock Poga" + } + } }, { "DataId": 1048826, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json b/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json index 2c3e7a840..7ac485400 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json @@ -103,6 +103,11 @@ { "Sequence": 5, "Steps": [ + { + "TerritoryId": 1188, + "InteractionType": "AttuneAetheryte", + "Aetheryte": "Kozama'uka - Dock Poga" + }, { "DataId": 2013937, "Position": { From 187427045b0b147670470d774696e46f0a6ef776 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 28 Dec 2024 19:52:45 +0100 Subject: [PATCH 047/109] Fix 'Law of the Land' --- .../D-Shaaloani-HeritageFound1/4916_Law of the Land.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4916_Law of the Land.json b/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4916_Law of the Land.json index 564a66cc6..ccc5fe354 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4916_Law of the Land.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4916_Law of the Land.json @@ -126,9 +126,9 @@ { "DataId": 2013807, "Position": { - "X": 34.927856, - "Y": 4.776001, - "Z": 297.68823 + "X": 37.15564, + "Y": 4.2266846, + "Z": 290.66907 }, "StopDistance": 1, "TerritoryId": 1190, From f20b5e08a764c42f3dba1323a36338b52115ab55 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 28 Dec 2024 22:26:51 +0100 Subject: [PATCH 048/109] Add non-flying waypoints to 'Gwok Away' --- .../Heritage Found/5149_Gwok Away.json | 138 ++++++++++++++++++ .../Validators/CompletionFlagsValidator.cs | 4 + 2 files changed, 142 insertions(+) diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Heritage Found/5149_Gwok Away.json b/QuestPaths/7.x - Dawntrail/Side Quests/Heritage Found/5149_Gwok Away.json index 53995c76b..3ccf74eaf 100644 --- a/QuestPaths/7.x - Dawntrail/Side Quests/Heritage Found/5149_Gwok Away.json +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Heritage Found/5149_Gwok Away.json @@ -20,6 +20,52 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": -212.22218, + "Y": 30, + "Z": -620.3656 + }, + "TerritoryId": 1191, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "Flying": "Unlocked", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + } + }, + { + "DataId": 2014079, + "Position": { + "X": -213.24487, + "Y": 30.838379, + "Z": -618.0362 + }, + "TerritoryId": 1191, + "InteractionType": "UseItem", + "ItemId": 2003594, + "SkipConditions": { + "StepIf": { + "Flying": "Unlocked" + } + }, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, { "DataId": 2014079, "Position": { @@ -41,6 +87,52 @@ 64 ] }, + { + "Position": { + "X": -274.73184, + "Y": 36.99997, + "Z": -506.5031 + }, + "TerritoryId": 1191, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "Flying": "Unlocked", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + } + }, + { + "DataId": 2014078, + "Position": { + "X": -272.8161, + "Y": 37.857544, + "Z": -504.9058 + }, + "TerritoryId": 1191, + "InteractionType": "UseItem", + "ItemId": 2003594, + "SkipConditions": { + "StepIf": { + "Flying": "Unlocked" + } + }, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, { "DataId": 2014078, "Position": { @@ -62,6 +154,52 @@ 128 ] }, + { + "Position": { + "X": -346.93515, + "Y": 37.00001, + "Z": -611.26953 + }, + "TerritoryId": 1191, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "Flying": "Unlocked", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + } + }, + { + "DataId": 2014080, + "Position": { + "X": -349.1112, + "Y": 37.857544, + "Z": -610.5898 + }, + "TerritoryId": 1191, + "InteractionType": "UseItem", + "ItemId": 2003594, + "SkipConditions": { + "StepIf": { + "Flying": "Unlocked" + } + }, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, { "DataId": 2014080, "Position": { diff --git a/Questionable/Validation/Validators/CompletionFlagsValidator.cs b/Questionable/Validation/Validators/CompletionFlagsValidator.cs index e5c9fdc12..dc36bcc14 100644 --- a/Questionable/Validation/Validators/CompletionFlagsValidator.cs +++ b/Questionable/Validation/Validators/CompletionFlagsValidator.cs @@ -11,6 +11,10 @@ internal sealed class CompletionFlagsValidator : IQuestValidator { public IEnumerable Validate(Quest quest) { + // this maybe should check for skipconditions, but this applies to one quest only atm + if (quest.Id.Value == 5149) + yield break; + foreach (var sequence in quest.AllSequences()) { var mappedCompletionFlags = sequence.Steps From 8d85a0f896ac09e449717aa790ba939d482a8fc3 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 30 Dec 2024 02:50:18 +0100 Subject: [PATCH 049/109] Add AutoDuty integration --- .../RoslynElements/QuestStepExtensions.cs | 3 + .../Shared/245_It's Probably Pirates.json | 3 +- .../MSQ-1/Shared/343_Lord of the Inferno.json | 3 +- .../MSQ-1/Shared/660_Into a Copper Hell.json | 3 +- .../MSQ-1/Shared/677_Fire in the Gloom.json | 3 +- .../514_Into the Beast's Maw.json | 3 +- .../801_Skeletons in Her Closet.json | 3 +- .../832_The Things We Do for Cheese.json | 3 +- .../MSQ-2/B4-Titan/857_Lord of Crags.json | 3 +- .../952_In Pursuit of the Past.json | 3 +- .../C3-Garuda/519_Lady of the Vortex.json | 3 +- .../3873_Rock the Castrum.json | 3 +- .../4522_The Ultimate Weapon.json | 6 +- .../E4-2.4/75_The Path of the Righteous.json | 3 +- .../MSQ-2/E5-2.5/366_The Rising Chorus.json | 3 +- .../1131_Gilding the Bilious (Maelstrom).json | 3 +- ...1132_Gilding the Bilious (Twin Adder).json | 3 +- ...Gilding the Bilious (Immortal Flames).json | 3 +- .../2111_For All the Nights to Come.json | 3 +- .../1617_Mourn in Passing.json | 3 +- .../1634_Into the Aery.json | 3 +- .../A4-Ishgard/1640_A Knight's Calling.json | 3 +- .../1660_Forbidden Knowledge.json | 3 +- .../MSQ/A7-Azys Lla/1669_Heavensward.json | 3 +- .../C-3.2/2232_The Word of the Mother.json | 3 +- .../MSQ/E-3.4/2342_Shadows of the First.json | 3 +- .../2354_Griffin, Griffin on the Wall.json | 3 +- .../2469_Not without Incident.json | 3 +- .../MSQ/A5-Yanxia 2/2524_The Die Is Cast.json | 3 +- .../2544_The Price of Freedom.json | 3 +- .../MSQ/B-4.1/2964_The Mad King's Trove.json | 3 +- .../MSQ/E-4.4/3144_Feel the Burn.json | 3 +- .../MSQ/F-4.5/3183_The Face of War.json | 3 +- .../3300_The Lightwardens.json | 3 +- .../B-Il Mheg/3312_The Key to the Castle.json | 3 +- .../3340_The Burden of Knowledge.json | 3 +- .../3643_Extinguishing the Last Light.json | 3 +- .../MSQ/H-5.2/3769_Beneath the Surface.json | 3 +- .../4377_In the Dark of the Tower.json | 3 +- .../MSQ/D-Thavnair2/4409_Skies Aflame.json | 3 +- .../E-Elpis/4437_Caging the Messenger.json | 3 +- .../4449_Her Children One and All.json | 6 +- .../MSQ/H-6.1/4529_Alzadaals Legacy.json | 3 +- .../MSQ/I-6.2/4592_In Search of Azdaja.json | 3 +- .../MSQ/J-6.3/4674_King of the Mountain.json | 3 +- .../MSQ/K-6.4/4736_Going Haam.json | 3 +- .../MSQ/L-6.5/4748_Down in the Dark.json | 3 +- .../4879_For All Turali.json | 3 +- .../4891_The High Luminary.json | 3 +- .../4909_Road to the Golden City.json | 3 +- .../4926_All Aboard.json | 3 +- .../4945_The Resilient Son.json | 3 +- .../MSQ/F-Living Memory/4959_Dawntrail.json | 3 +- .../MSQ/G-7.1/5246_In Search of the Past.json | 3 +- QuestPaths/quest-v1.json | 3 + Questionable.Model/Questing/QuestStep.cs | 1 + Questionable/Configuration.cs | 11 +- Questionable/Controller/QuestRegistry.cs | 29 +- .../Steps/Common/SendNotification.cs | 3 +- .../Controller/Steps/Interactions/Duty.cs | 78 +++++- .../Controller/Steps/Shared/WaitAtEnd.cs | 6 +- Questionable/Data/TerritoryData.cs | 24 +- Questionable/External/AutoDutyIpc.cs | 89 ++++++ Questionable/QuestionablePlugin.cs | 5 +- Questionable/Windows/ConfigWindow.cs | 254 +++++++++++++++++- 65 files changed, 599 insertions(+), 72 deletions(-) create mode 100644 Questionable/External/AutoDutyIpc.cs diff --git a/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs index 12b27ef4e..6b76bb95e 100644 --- a/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs +++ b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs @@ -117,6 +117,9 @@ internal static class QuestStepExtensions Assignment(nameof(QuestStep.ContentFinderConditionId), step.ContentFinderConditionId, emptyStep.ContentFinderConditionId) .AsSyntaxNodeOrToken(), + Assignment(nameof(QuestStep.AutoDutyEnabled), + step.AutoDutyEnabled, emptyStep.AutoDutyEnabled) + .AsSyntaxNodeOrToken(), Assignment(nameof(QuestStep.SkipConditions), step.SkipConditions, emptyStep.SkipConditions) .AsSyntaxNodeOrToken(), diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/245_It's Probably Pirates.json b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/245_It's Probably Pirates.json index 8a3522540..0d3aada90 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/245_It's Probably Pirates.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/245_It's Probably Pirates.json @@ -112,7 +112,8 @@ { "TerritoryId": 138, "InteractionType": "Duty", - "ContentFinderConditionId": 4 + "ContentFinderConditionId": 4, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/343_Lord of the Inferno.json b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/343_Lord of the Inferno.json index ff980ffa8..cab6933d0 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/343_Lord of the Inferno.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/343_Lord of the Inferno.json @@ -71,7 +71,8 @@ { "TerritoryId": 146, "InteractionType": "Duty", - "ContentFinderConditionId": 56 + "ContentFinderConditionId": 56, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/660_Into a Copper Hell.json b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/660_Into a Copper Hell.json index b6f45f31c..e5c21738f 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/660_Into a Copper Hell.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/660_Into a Copper Hell.json @@ -62,7 +62,8 @@ { "TerritoryId": 140, "InteractionType": "Duty", - "ContentFinderConditionId": 3 + "ContentFinderConditionId": 3, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/677_Fire in the Gloom.json b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/677_Fire in the Gloom.json index 7340e66a7..726eae291 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/677_Fire in the Gloom.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/677_Fire in the Gloom.json @@ -57,7 +57,8 @@ { "TerritoryId": 148, "InteractionType": "Duty", - "ContentFinderConditionId": 2 + "ContentFinderConditionId": 2, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A3-South Shroud, Buscarron’s Druthers/514_Into the Beast's Maw.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A3-South Shroud, Buscarron’s Druthers/514_Into the Beast's Maw.json index cf0acff26..45b28b3fd 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A3-South Shroud, Buscarron’s Druthers/514_Into the Beast's Maw.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A3-South Shroud, Buscarron’s Druthers/514_Into the Beast's Maw.json @@ -44,7 +44,8 @@ { "TerritoryId": 153, "InteractionType": "Duty", - "ContentFinderConditionId": 1 + "ContentFinderConditionId": 1, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json index c3a02a0ca..9269a84bd 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json @@ -66,7 +66,8 @@ { "TerritoryId": 148, "InteractionType": "Duty", - "ContentFinderConditionId": 6 + "ContentFinderConditionId": 6, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json index bcb40f054..06402bacb 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json @@ -85,7 +85,8 @@ { "TerritoryId": 137, "InteractionType": "Duty", - "ContentFinderConditionId": 8 + "ContentFinderConditionId": 8, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B4-Titan/857_Lord of Crags.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B4-Titan/857_Lord of Crags.json index e08981891..4cc4c5768 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B4-Titan/857_Lord of Crags.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B4-Titan/857_Lord of Crags.json @@ -45,7 +45,8 @@ { "TerritoryId": 139, "InteractionType": "Duty", - "ContentFinderConditionId": 57 + "ContentFinderConditionId": 57, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/952_In Pursuit of the Past.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/952_In Pursuit of the Past.json index ad446eeb1..57ef1fa99 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/952_In Pursuit of the Past.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C1-Coerthas Central Highlands, The Enterprise/952_In Pursuit of the Past.json @@ -59,7 +59,8 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 11 + "ContentFinderConditionId": 11, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C3-Garuda/519_Lady of the Vortex.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C3-Garuda/519_Lady of the Vortex.json index ff50fed79..d9315eca2 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C3-Garuda/519_Lady of the Vortex.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C3-Garuda/519_Lady of the Vortex.json @@ -38,7 +38,8 @@ { "TerritoryId": 331, "InteractionType": "Duty", - "ContentFinderConditionId": 58 + "ContentFinderConditionId": 58, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json index f7d746fe6..7eec220ae 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json @@ -45,7 +45,8 @@ { "TerritoryId": 147, "InteractionType": "Duty", - "ContentFinderConditionId": 15 + "ContentFinderConditionId": 15, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4522_The Ultimate Weapon.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4522_The Ultimate Weapon.json index c878f58b6..1a788c09f 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4522_The Ultimate Weapon.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4522_The Ultimate Weapon.json @@ -46,7 +46,8 @@ { "TerritoryId": 147, "InteractionType": "Duty", - "ContentFinderConditionId": 16 + "ContentFinderConditionId": 16, + "AutoDutyEnabled": true } ] }, @@ -71,7 +72,8 @@ { "TerritoryId": 1053, "InteractionType": "Duty", - "ContentFinderConditionId": 830 + "ContentFinderConditionId": 830, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/75_The Path of the Righteous.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/75_The Path of the Righteous.json index 34e9b723c..b6581b9a8 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/75_The Path of the Righteous.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E4-2.4/75_The Path of the Righteous.json @@ -88,7 +88,8 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 27 + "ContentFinderConditionId": 27, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/366_The Rising Chorus.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/366_The Rising Chorus.json index fc1d72204..24d72b214 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/366_The Rising Chorus.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/E5-2.5/366_The Rising Chorus.json @@ -107,7 +107,8 @@ { "TerritoryId": 156, "InteractionType": "Duty", - "ContentFinderConditionId": 32 + "ContentFinderConditionId": 32, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json index e0157efee..165a1839c 100644 --- a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json @@ -71,7 +71,8 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 5 + "ContentFinderConditionId": 5, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json index 178a0b5a4..4defc6a91 100644 --- a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json @@ -71,7 +71,8 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 5 + "ContentFinderConditionId": 5, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json index 8915d6714..cf83d8a4c 100644 --- a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json @@ -71,7 +71,8 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 5 + "ContentFinderConditionId": 5, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json b/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json index 5c9fa391d..5961d3e18 100644 --- a/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json +++ b/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json @@ -38,7 +38,8 @@ { "TerritoryId": 397, "InteractionType": "Duty", - "ContentFinderConditionId": 36 + "ContentFinderConditionId": 36, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/A3.2-The Dravanian Forelands/1617_Mourn in Passing.json b/QuestPaths/3.x - Heavensward/MSQ/A3.2-The Dravanian Forelands/1617_Mourn in Passing.json index 78abed7d6..a321c7415 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/A3.2-The Dravanian Forelands/1617_Mourn in Passing.json +++ b/QuestPaths/3.x - Heavensward/MSQ/A3.2-The Dravanian Forelands/1617_Mourn in Passing.json @@ -78,7 +78,8 @@ { "TerritoryId": 398, "InteractionType": "Duty", - "ContentFinderConditionId": 37 + "ContentFinderConditionId": 37, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/A3.3-The Churning Mists/1634_Into the Aery.json b/QuestPaths/3.x - Heavensward/MSQ/A3.3-The Churning Mists/1634_Into the Aery.json index 471a16662..02098cab9 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/A3.3-The Churning Mists/1634_Into the Aery.json +++ b/QuestPaths/3.x - Heavensward/MSQ/A3.3-The Churning Mists/1634_Into the Aery.json @@ -42,7 +42,8 @@ { "TerritoryId": 418, "InteractionType": "Duty", - "ContentFinderConditionId": 39 + "ContentFinderConditionId": 39, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/A4-Ishgard/1640_A Knight's Calling.json b/QuestPaths/3.x - Heavensward/MSQ/A4-Ishgard/1640_A Knight's Calling.json index 492a0d582..9165e2a02 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/A4-Ishgard/1640_A Knight's Calling.json +++ b/QuestPaths/3.x - Heavensward/MSQ/A4-Ishgard/1640_A Knight's Calling.json @@ -59,7 +59,8 @@ { "TerritoryId": 419, "InteractionType": "Duty", - "ContentFinderConditionId": 34 + "ContentFinderConditionId": 34, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/A6-The Dravanian Hinterlands/1660_Forbidden Knowledge.json b/QuestPaths/3.x - Heavensward/MSQ/A6-The Dravanian Hinterlands/1660_Forbidden Knowledge.json index cf7fe15e4..dab4f3da3 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/A6-The Dravanian Hinterlands/1660_Forbidden Knowledge.json +++ b/QuestPaths/3.x - Heavensward/MSQ/A6-The Dravanian Hinterlands/1660_Forbidden Knowledge.json @@ -110,7 +110,8 @@ { "TerritoryId": 399, "InteractionType": "Duty", - "ContentFinderConditionId": 31 + "ContentFinderConditionId": 31, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/A7-Azys Lla/1669_Heavensward.json b/QuestPaths/3.x - Heavensward/MSQ/A7-Azys Lla/1669_Heavensward.json index 6b6bd71cd..7bef51cc7 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/A7-Azys Lla/1669_Heavensward.json +++ b/QuestPaths/3.x - Heavensward/MSQ/A7-Azys Lla/1669_Heavensward.json @@ -62,7 +62,8 @@ { "TerritoryId": 402, "InteractionType": "Duty", - "ContentFinderConditionId": 38 + "ContentFinderConditionId": 38, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/C-3.2/2232_The Word of the Mother.json b/QuestPaths/3.x - Heavensward/MSQ/C-3.2/2232_The Word of the Mother.json index 8cb385f48..fe2c33676 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/C-3.2/2232_The Word of the Mother.json +++ b/QuestPaths/3.x - Heavensward/MSQ/C-3.2/2232_The Word of the Mother.json @@ -77,7 +77,8 @@ { "TerritoryId": 463, "InteractionType": "Duty", - "ContentFinderConditionId": 141 + "ContentFinderConditionId": 141, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/E-3.4/2342_Shadows of the First.json b/QuestPaths/3.x - Heavensward/MSQ/E-3.4/2342_Shadows of the First.json index a2bb1f45e..c3d9d0847 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/E-3.4/2342_Shadows of the First.json +++ b/QuestPaths/3.x - Heavensward/MSQ/E-3.4/2342_Shadows of the First.json @@ -57,7 +57,8 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 182 + "ContentFinderConditionId": 182, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/3.x - Heavensward/MSQ/F-3.5/2354_Griffin, Griffin on the Wall.json b/QuestPaths/3.x - Heavensward/MSQ/F-3.5/2354_Griffin, Griffin on the Wall.json index feba4bf06..42aef1f00 100644 --- a/QuestPaths/3.x - Heavensward/MSQ/F-3.5/2354_Griffin, Griffin on the Wall.json +++ b/QuestPaths/3.x - Heavensward/MSQ/F-3.5/2354_Griffin, Griffin on the Wall.json @@ -109,7 +109,8 @@ { "TerritoryId": 152, "InteractionType": "Duty", - "ContentFinderConditionId": 219 + "ContentFinderConditionId": 219, + "AutoDutyEnabled": true } ] }, 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 index 214a764af..6477857e4 100644 --- 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 @@ -87,7 +87,8 @@ { "TerritoryId": 680, "InteractionType": "Duty", - "ContentFinderConditionId": 238 + "ContentFinderConditionId": 238, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/4.x - Stormblood/MSQ/A5-Yanxia 2/2524_The Die Is Cast.json b/QuestPaths/4.x - Stormblood/MSQ/A5-Yanxia 2/2524_The Die Is Cast.json index 2811433e5..702737b31 100644 --- a/QuestPaths/4.x - Stormblood/MSQ/A5-Yanxia 2/2524_The Die Is Cast.json +++ b/QuestPaths/4.x - Stormblood/MSQ/A5-Yanxia 2/2524_The Die Is Cast.json @@ -114,7 +114,8 @@ { "TerritoryId": 614, "InteractionType": "Duty", - "ContentFinderConditionId": 241 + "ContentFinderConditionId": 241, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/4.x - Stormblood/MSQ/A6.2-Peaks 2/2544_The Price of Freedom.json b/QuestPaths/4.x - Stormblood/MSQ/A6.2-Peaks 2/2544_The Price of Freedom.json index 3cdd92981..a0b37e350 100644 --- a/QuestPaths/4.x - Stormblood/MSQ/A6.2-Peaks 2/2544_The Price of Freedom.json +++ b/QuestPaths/4.x - Stormblood/MSQ/A6.2-Peaks 2/2544_The Price of Freedom.json @@ -114,7 +114,8 @@ { "TerritoryId": 620, "InteractionType": "Duty", - "ContentFinderConditionId": 242 + "ContentFinderConditionId": 242, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/4.x - Stormblood/MSQ/B-4.1/2964_The Mad King's Trove.json b/QuestPaths/4.x - Stormblood/MSQ/B-4.1/2964_The Mad King's Trove.json index d23fe19c2..0856bbe6f 100644 --- a/QuestPaths/4.x - Stormblood/MSQ/B-4.1/2964_The Mad King's Trove.json +++ b/QuestPaths/4.x - Stormblood/MSQ/B-4.1/2964_The Mad King's Trove.json @@ -98,7 +98,8 @@ { "TerritoryId": 621, "InteractionType": "Duty", - "ContentFinderConditionId": 279 + "ContentFinderConditionId": 279, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/4.x - Stormblood/MSQ/E-4.4/3144_Feel the Burn.json b/QuestPaths/4.x - Stormblood/MSQ/E-4.4/3144_Feel the Burn.json index 25ec97183..fba0763d8 100644 --- a/QuestPaths/4.x - Stormblood/MSQ/E-4.4/3144_Feel the Burn.json +++ b/QuestPaths/4.x - Stormblood/MSQ/E-4.4/3144_Feel the Burn.json @@ -40,7 +40,8 @@ { "TerritoryId": 614, "InteractionType": "Duty", - "ContentFinderConditionId": 585 + "ContentFinderConditionId": 585, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/4.x - Stormblood/MSQ/F-4.5/3183_The Face of War.json b/QuestPaths/4.x - Stormblood/MSQ/F-4.5/3183_The Face of War.json index c32f5c02c..fb9960de0 100644 --- a/QuestPaths/4.x - Stormblood/MSQ/F-4.5/3183_The Face of War.json +++ b/QuestPaths/4.x - Stormblood/MSQ/F-4.5/3183_The Face of War.json @@ -27,7 +27,8 @@ { "TerritoryId": 829, "InteractionType": "Duty", - "ContentFinderConditionId": 611 + "ContentFinderConditionId": 611, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/MSQ/A4-Crystarium 2/3300_The Lightwardens.json b/QuestPaths/5.x - Shadowbringers/MSQ/A4-Crystarium 2/3300_The Lightwardens.json index d4eef79d6..7f9a5a948 100644 --- a/QuestPaths/5.x - Shadowbringers/MSQ/A4-Crystarium 2/3300_The Lightwardens.json +++ b/QuestPaths/5.x - Shadowbringers/MSQ/A4-Crystarium 2/3300_The Lightwardens.json @@ -120,7 +120,8 @@ { "TerritoryId": 813, "InteractionType": "Duty", - "ContentFinderConditionId": 676 + "ContentFinderConditionId": 676, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/MSQ/B-Il Mheg/3312_The Key to the Castle.json b/QuestPaths/5.x - Shadowbringers/MSQ/B-Il Mheg/3312_The Key to the Castle.json index 8f5193b0b..d1dfe7dcf 100644 --- a/QuestPaths/5.x - Shadowbringers/MSQ/B-Il Mheg/3312_The Key to the Castle.json +++ b/QuestPaths/5.x - Shadowbringers/MSQ/B-Il Mheg/3312_The Key to the Castle.json @@ -49,7 +49,8 @@ { "TerritoryId": 816, "InteractionType": "Duty", - "ContentFinderConditionId": 649 + "ContentFinderConditionId": 649, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/MSQ/C-Rak'tika/3340_The Burden of Knowledge.json b/QuestPaths/5.x - Shadowbringers/MSQ/C-Rak'tika/3340_The Burden of Knowledge.json index 075dff0cc..39284d2f7 100644 --- a/QuestPaths/5.x - Shadowbringers/MSQ/C-Rak'tika/3340_The Burden of Knowledge.json +++ b/QuestPaths/5.x - Shadowbringers/MSQ/C-Rak'tika/3340_The Burden of Knowledge.json @@ -61,7 +61,8 @@ { "TerritoryId": 817, "InteractionType": "Duty", - "ContentFinderConditionId": 651 + "ContentFinderConditionId": 651, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/MSQ/E-Kholusia 2/3643_Extinguishing the Last Light.json b/QuestPaths/5.x - Shadowbringers/MSQ/E-Kholusia 2/3643_Extinguishing the Last Light.json index 9ee12fd73..80cbd172f 100644 --- a/QuestPaths/5.x - Shadowbringers/MSQ/E-Kholusia 2/3643_Extinguishing the Last Light.json +++ b/QuestPaths/5.x - Shadowbringers/MSQ/E-Kholusia 2/3643_Extinguishing the Last Light.json @@ -62,7 +62,8 @@ { "TerritoryId": 814, "InteractionType": "Duty", - "ContentFinderConditionId": 659 + "ContentFinderConditionId": 659, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/MSQ/H-5.2/3769_Beneath the Surface.json b/QuestPaths/5.x - Shadowbringers/MSQ/H-5.2/3769_Beneath the Surface.json index c947dc964..41dd83152 100644 --- a/QuestPaths/5.x - Shadowbringers/MSQ/H-5.2/3769_Beneath the Surface.json +++ b/QuestPaths/5.x - Shadowbringers/MSQ/H-5.2/3769_Beneath the Surface.json @@ -40,7 +40,8 @@ { "TerritoryId": 814, "InteractionType": "Duty", - "ContentFinderConditionId": 714 + "ContentFinderConditionId": 714, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4377_In the Dark of the Tower.json b/QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4377_In the Dark of the Tower.json index 22f2d97ab..c4336959c 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4377_In the Dark of the Tower.json +++ b/QuestPaths/6.x - Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4377_In the Dark of the Tower.json @@ -55,7 +55,8 @@ { "TerritoryId": 957, "InteractionType": "Duty", - "ContentFinderConditionId": 783 + "ContentFinderConditionId": 783, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json b/QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json index 37285324e..9c0d3a487 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json +++ b/QuestPaths/6.x - Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json @@ -71,7 +71,8 @@ { "TerritoryId": 957, "InteractionType": "Duty", - "ContentFinderConditionId": 789 + "ContentFinderConditionId": 789, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/E-Elpis/4437_Caging the Messenger.json b/QuestPaths/6.x - Endwalker/MSQ/E-Elpis/4437_Caging the Messenger.json index 0a7e8e555..9dd680ebd 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/E-Elpis/4437_Caging the Messenger.json +++ b/QuestPaths/6.x - Endwalker/MSQ/E-Elpis/4437_Caging the Messenger.json @@ -39,7 +39,8 @@ { "TerritoryId": 961, "InteractionType": "Duty", - "ContentFinderConditionId": 787 + "ContentFinderConditionId": 787, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json b/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json index 5294bab43..f41bf9552 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json +++ b/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json @@ -38,7 +38,8 @@ { "TerritoryId": 956, "InteractionType": "Duty", - "ContentFinderConditionId": 786 + "ContentFinderConditionId": 786, + "AutoDutyEnabled": true } ] }, @@ -63,7 +64,8 @@ { "TerritoryId": 1030, "InteractionType": "Duty", - "ContentFinderConditionId": 790 + "ContentFinderConditionId": 790, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/H-6.1/4529_Alzadaals Legacy.json b/QuestPaths/6.x - Endwalker/MSQ/H-6.1/4529_Alzadaals Legacy.json index c79468bb3..dc9324d1d 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/H-6.1/4529_Alzadaals Legacy.json +++ b/QuestPaths/6.x - Endwalker/MSQ/H-6.1/4529_Alzadaals Legacy.json @@ -23,7 +23,8 @@ { "TerritoryId": 957, "InteractionType": "Duty", - "ContentFinderConditionId": 844 + "ContentFinderConditionId": 844, + "AutoDutyEnabled": false } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/I-6.2/4592_In Search of Azdaja.json b/QuestPaths/6.x - Endwalker/MSQ/I-6.2/4592_In Search of Azdaja.json index cc6ea1fad..c91af5976 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/I-6.2/4592_In Search of Azdaja.json +++ b/QuestPaths/6.x - Endwalker/MSQ/I-6.2/4592_In Search of Azdaja.json @@ -71,7 +71,8 @@ { "TerritoryId": 1056, "InteractionType": "Duty", - "ContentFinderConditionId": 869 + "ContentFinderConditionId": 869, + "AutoDutyEnabled": false } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/J-6.3/4674_King of the Mountain.json b/QuestPaths/6.x - Endwalker/MSQ/J-6.3/4674_King of the Mountain.json index 130cb389e..df1bd69f0 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/J-6.3/4674_King of the Mountain.json +++ b/QuestPaths/6.x - Endwalker/MSQ/J-6.3/4674_King of the Mountain.json @@ -57,7 +57,8 @@ "TerritoryId": 958, "InteractionType": "Duty", "Comment": "Lapis Manalis", - "ContentFinderConditionId": 896 + "ContentFinderConditionId": 896, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/K-6.4/4736_Going Haam.json b/QuestPaths/6.x - Endwalker/MSQ/K-6.4/4736_Going Haam.json index 9f738bc8f..8af360800 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/K-6.4/4736_Going Haam.json +++ b/QuestPaths/6.x - Endwalker/MSQ/K-6.4/4736_Going Haam.json @@ -160,7 +160,8 @@ { "TerritoryId": 962, "InteractionType": "Duty", - "ContentFinderConditionId": 822 + "ContentFinderConditionId": 822, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/MSQ/L-6.5/4748_Down in the Dark.json b/QuestPaths/6.x - Endwalker/MSQ/L-6.5/4748_Down in the Dark.json index 3930a8dde..96953ea27 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/L-6.5/4748_Down in the Dark.json +++ b/QuestPaths/6.x - Endwalker/MSQ/L-6.5/4748_Down in the Dark.json @@ -24,7 +24,8 @@ { "TerritoryId": 1162, "InteractionType": "Duty", - "ContentFinderConditionId": 823 + "ContentFinderConditionId": 823, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json b/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json index 28e35590e..28a6850cd 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json @@ -58,7 +58,8 @@ { "TerritoryId": 1185, "InteractionType": "Duty", - "ContentFinderConditionId": 826 + "ContentFinderConditionId": 826, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4891_The High Luminary.json b/QuestPaths/7.x - Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4891_The High Luminary.json index 8b1a2021b..2ef3a8e69 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4891_The High Luminary.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4891_The High Luminary.json @@ -23,7 +23,8 @@ { "TerritoryId": 1187, "InteractionType": "Duty", - "ContentFinderConditionId": 824 + "ContentFinderConditionId": 824, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/C-Yak T'el/4909_Road to the Golden City.json b/QuestPaths/7.x - Dawntrail/MSQ/C-Yak T'el/4909_Road to the Golden City.json index 384623cef..528fde3f8 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/C-Yak T'el/4909_Road to the Golden City.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/C-Yak T'el/4909_Road to the Golden City.json @@ -115,7 +115,8 @@ { "TerritoryId": 1189, "InteractionType": "Duty", - "ContentFinderConditionId": 829 + "ContentFinderConditionId": 829, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json b/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json index 51a119877..682576cb3 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json @@ -60,7 +60,8 @@ { "TerritoryId": 1219, "InteractionType": "Duty", - "ContentFinderConditionId": 831 + "ContentFinderConditionId": 831, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json b/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json index 8e9677088..15817e8d1 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json @@ -39,7 +39,8 @@ { "TerritoryId": 1191, "InteractionType": "Duty", - "ContentFinderConditionId": 825 + "ContentFinderConditionId": 825, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json b/QuestPaths/7.x - Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json index 778f11db5..cafc8975c 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json @@ -56,7 +56,8 @@ { "TerritoryId": 1192, "InteractionType": "Duty", - "ContentFinderConditionId": 827 + "ContentFinderConditionId": 827, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/G-7.1/5246_In Search of the Past.json b/QuestPaths/7.x - Dawntrail/MSQ/G-7.1/5246_In Search of the Past.json index 6d0878d14..40f6d44d7 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/G-7.1/5246_In Search of the Past.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/G-7.1/5246_In Search of the Past.json @@ -122,7 +122,8 @@ { "TerritoryId": 1191, "InteractionType": "Duty", - "ContentFinderConditionId": 1008 + "ContentFinderConditionId": 1008, + "AutoDutyEnabled": true } ] }, diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index cb035ef71..eab9789a6 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -1217,6 +1217,9 @@ "exclusiveMinimum": 0, "exclusiveMaximum": 3000 }, + "AutoDutyEnabled": { + "type": "boolean" + }, "DataId": { "type": "null" }, diff --git a/Questionable.Model/Questing/QuestStep.cs b/Questionable.Model/Questing/QuestStep.cs index 0b4a05a21..bd1ce3040 100644 --- a/Questionable.Model/Questing/QuestStep.cs +++ b/Questionable.Model/Questing/QuestStep.cs @@ -74,6 +74,7 @@ public sealed class QuestStep public JumpDestination? JumpDestination { get; set; } public uint? ContentFinderConditionId { get; set; } + public bool AutoDutyEnabled { get; set; } public SkipConditions? SkipConditions { get; set; } public List?> RequiredQuestVariables { get; set; } = new(); diff --git a/Questionable/Configuration.cs b/Questionable/Configuration.cs index b4eb5a5b8..90c42bb50 100644 --- a/Questionable/Configuration.cs +++ b/Questionable/Configuration.cs @@ -1,4 +1,5 @@ -using Dalamud.Configuration; +using System.Collections.Generic; +using Dalamud.Configuration; using Dalamud.Game.Text; using FFXIVClientStructs.FFXIV.Client.UI.Agent; using LLib.ImGui; @@ -12,6 +13,7 @@ internal sealed class Configuration : IPluginConfiguration public int Version { get; set; } = 1; public int PluginSetupCompleteVersion { get; set; } public GeneralConfiguration General { get; } = new(); + public DutyConfiguration Duties { get; } = new(); public NotificationConfiguration Notifications { get; } = new(); public AdvancedConfiguration Advanced { get; } = new(); public WindowConfig DebugWindowConfig { get; } = new(); @@ -32,6 +34,13 @@ internal sealed class Configuration : IPluginConfiguration public bool ConfigureTextAdvance { get; set; } = true; } + internal sealed class DutyConfiguration + { + public bool RunInstancedContentWithAutoDuty { get; set; } + public HashSet WhitelistedDutyCfcIds { get; set; } = []; + public HashSet BlacklistedDutyCfcIds { get; set; } = []; + } + internal sealed class NotificationConfiguration { public bool Enabled { get; set; } = true; diff --git a/Questionable/Controller/QuestRegistry.cs b/Questionable/Controller/QuestRegistry.cs index c948abe23..d6641073c 100644 --- a/Questionable/Controller/QuestRegistry.cs +++ b/Questionable/Controller/QuestRegistry.cs @@ -29,7 +29,8 @@ internal sealed class QuestRegistry private readonly LeveData _leveData; private readonly ICallGateProvider _reloadDataIpc; - private readonly Dictionary _quests = new(); + private readonly Dictionary _quests = []; + private readonly Dictionary _contentFinderConditionIds = []; public QuestRegistry(IDalamudPluginInterface pluginInterface, QuestData questData, QuestValidator questValidator, JsonSchemaValidator jsonSchemaValidator, @@ -55,6 +56,7 @@ internal sealed class QuestRegistry { _questValidator.Reset(); _quests.Clear(); + _contentFinderConditionIds.Clear(); LoadQuestsFromAssembly(); LoadQuestsFromProjectDirectory(); @@ -70,6 +72,7 @@ internal sealed class QuestRegistry "Failed to load all quests from user directory (some may have been successfully loaded)"); } + LoadCfcIds(); ValidateQuests(); Reloaded?.Invoke(this, EventArgs.Empty); try @@ -142,6 +145,18 @@ internal sealed class QuestRegistry } } + private void LoadCfcIds() + { + foreach (var quest in _quests.Values) + { + foreach (var dutyStep in quest.AllSteps().Where(x => + x.Step.InteractionType == EInteractionType.Duty && x.Step.ContentFinderConditionId != null)) + { + _contentFinderConditionIds[dutyStep.Step.ContentFinderConditionId!.Value] = (quest.Id, dutyStep.Step); + } + } + } + private void ValidateQuests() { _questValidator.Validate(_quests.Values.Where(x => x.Source != Quest.ESource.Assembly).ToList()); @@ -223,4 +238,16 @@ internal sealed class QuestRegistry .Where(x => IsKnownQuest(x.QuestId)) .ToList(); } + + public bool TryGetDutyByContentFinderConditionId(uint cfcId, out bool autoDutyEnabledByDefault) + { + if (_contentFinderConditionIds.TryGetValue(cfcId, out var value)) + { + autoDutyEnabledByDefault = value.Step.AutoDutyEnabled; + return true; + } + + autoDutyEnabledByDefault = false; + return false; + } } diff --git a/Questionable/Controller/Steps/Common/SendNotification.cs b/Questionable/Controller/Steps/Common/SendNotification.cs index 7334ca075..e83a1186c 100644 --- a/Questionable/Controller/Steps/Common/SendNotification.cs +++ b/Questionable/Controller/Steps/Common/SendNotification.cs @@ -13,6 +13,7 @@ internal static class SendNotification { internal sealed class Factory( AutomatonIpc automatonIpc, + AutoDutyIpc autoDutyIpc, TerritoryData territoryData) : SimpleTaskFactory { public override ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step) @@ -21,7 +22,7 @@ internal static class SendNotification { EInteractionType.Snipe when !automatonIpc.IsAutoSnipeEnabled => new Task(step.InteractionType, step.Comment), - EInteractionType.Duty => + EInteractionType.Duty when !autoDutyIpc.IsConfiguredToRunContent(step.ContentFinderConditionId, step.AutoDutyEnabled) => new Task(step.InteractionType, step.ContentFinderConditionId.HasValue ? territoryData.GetContentFinderConditionName(step.ContentFinderConditionId.Value) : step.Comment), diff --git a/Questionable/Controller/Steps/Interactions/Duty.cs b/Questionable/Controller/Steps/Interactions/Duty.cs index 42c94d87b..fab5c6ed3 100644 --- a/Questionable/Controller/Steps/Interactions/Duty.cs +++ b/Questionable/Controller/Steps/Interactions/Duty.cs @@ -1,6 +1,10 @@ using System; +using System.Collections.Generic; using Dalamud.Game.ClientState.Conditions; using Dalamud.Plugin.Services; +using Questionable.Controller.Steps.Shared; +using Questionable.Data; +using Questionable.External; using Questionable.Functions; using Questionable.Model; using Questionable.Model.Questing; @@ -9,26 +13,86 @@ namespace Questionable.Controller.Steps.Interactions; internal static class Duty { - internal sealed class Factory : SimpleTaskFactory + internal sealed class Factory(AutoDutyIpc autoDutyIpc) : ITaskFactory { - public override ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step) + public IEnumerable CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) { if (step.InteractionType != EInteractionType.Duty) - return null; + yield break; ArgumentNullException.ThrowIfNull(step.ContentFinderConditionId); - return new Task(step.ContentFinderConditionId.Value); + + if (autoDutyIpc.IsConfiguredToRunContent(step.ContentFinderConditionId, step.AutoDutyEnabled)) + { + yield return new StartAutoDutyTask(step.ContentFinderConditionId.Value); + yield return new WaitAutoDutyTask(step.ContentFinderConditionId.Value); + yield return new WaitAtEnd.WaitNextStepOrSequence(); + } + else + { + yield return new OpenDutyFinderTask(step.ContentFinderConditionId.Value); + } } } - internal sealed record Task(uint ContentFinderConditionId) : ITask + internal sealed record StartAutoDutyTask(uint ContentFinderConditionId) : ITask + { + public override string ToString() => $"StartAutoDuty({ContentFinderConditionId})"; + } + + internal sealed class StartAutoDutyExecutor( + AutoDutyIpc autoDutyIpc, + TerritoryData territoryData, + IClientState clientState) : TaskExecutor + { + protected override bool Start() + { + autoDutyIpc.StartInstance(Task.ContentFinderConditionId); + return true; + } + + public override ETaskResult Update() + { + if (!territoryData.TryGetTerritoryIdForContentFinderCondition(Task.ContentFinderConditionId, + out uint territoryId)) + throw new TaskException("Failed to get territory ID for content finder condition"); + + return clientState.TerritoryType == territoryId ? ETaskResult.TaskComplete : ETaskResult.StillRunning; + } + } + + internal sealed record WaitAutoDutyTask(uint ContentFinderConditionId) : ITask + { + public override string ToString() => $"Wait(AutoDuty, left instance {ContentFinderConditionId})"; + } + + internal sealed class WaitAutoDutyExecutor( + AutoDutyIpc autoDutyIpc, + TerritoryData territoryData, + IClientState clientState) : TaskExecutor + { + protected override bool Start() => true; + + public override ETaskResult Update() + { + if (!territoryData.TryGetTerritoryIdForContentFinderCondition(Task.ContentFinderConditionId, + out uint territoryId)) + throw new TaskException("Failed to get territory ID for content finder condition"); + + return clientState.TerritoryType != territoryId && autoDutyIpc.IsStopped() + ? ETaskResult.TaskComplete + : ETaskResult.StillRunning; + } + } + + internal sealed record OpenDutyFinderTask(uint ContentFinderConditionId) : ITask { public override string ToString() => $"OpenDutyFinder({ContentFinderConditionId})"; } - internal sealed class OpenDutyWindowExecutor( + internal sealed class OpenDutyFinderExecutor( GameFunctions gameFunctions, - ICondition condition) : TaskExecutor + ICondition condition) : TaskExecutor { protected override bool Start() { diff --git a/Questionable/Controller/Steps/Shared/WaitAtEnd.cs b/Questionable/Controller/Steps/Shared/WaitAtEnd.cs index d64c009bf..0b3a02ba9 100644 --- a/Questionable/Controller/Steps/Shared/WaitAtEnd.cs +++ b/Questionable/Controller/Steps/Shared/WaitAtEnd.cs @@ -8,6 +8,7 @@ using Dalamud.Plugin.Services; using Questionable.Controller.Steps.Common; using Questionable.Controller.Utils; using Questionable.Data; +using Questionable.External; using Questionable.Functions; using Questionable.Model; using Questionable.Model.Questing; @@ -19,7 +20,8 @@ internal static class WaitAtEnd internal sealed class Factory( IClientState clientState, ICondition condition, - TerritoryData territoryData) + TerritoryData territoryData, + AutoDutyIpc autoDutyIpc) : ITaskFactory { public IEnumerable CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) @@ -50,7 +52,7 @@ internal static class WaitAtEnd case EInteractionType.Snipe: return [new WaitNextStepOrSequence()]; - case EInteractionType.Duty: + case EInteractionType.Duty when !autoDutyIpc.IsConfiguredToRunContent(step.ContentFinderConditionId, step.AutoDutyEnabled): case EInteractionType.SinglePlayerDuty: return [new EndAutomation()]; diff --git a/Questionable/Data/TerritoryData.cs b/Questionable/Data/TerritoryData.cs index ee91f6b44..970718b2f 100644 --- a/Questionable/Data/TerritoryData.cs +++ b/Questionable/Data/TerritoryData.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Collections.Immutable; using System.Globalization; using System.Linq; +using Dalamud.Game; using Dalamud.Plugin.Services; +using Dalamud.Utility; using FFXIVClientStructs.FFXIV.Client.Game.Character; using Lumina.Excel.Sheets; @@ -15,6 +18,7 @@ internal sealed class TerritoryData private readonly ImmutableDictionary _dutyTerritories; private readonly ImmutableDictionary _instanceNames; private readonly ImmutableDictionary _contentFinderConditionNames; + private readonly ImmutableDictionary _contentFinderConditionIds; public TerritoryData(IDataManager dataManager) { @@ -40,11 +44,14 @@ internal sealed class TerritoryData _instanceNames = dataManager.GetExcelSheet() .Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6) - .ToImmutableDictionary(x => x.Content.RowId, x => x.Name.ToString()); + .ToImmutableDictionary(x => x.Content.RowId, x => x.Name.ToDalamudString().ToString()); _contentFinderConditionNames = dataManager.GetExcelSheet() .Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6) - .ToImmutableDictionary(x => x.RowId, x => x.Name.ToString()); + .ToImmutableDictionary(x => x.RowId, x => FixName(x.Name.ToDalamudString().ToString(), dataManager.Language)); + _contentFinderConditionIds = dataManager.GetExcelSheet() + .Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6) + .ToImmutableDictionary(x => x.RowId, x => x.TerritoryType.RowId); } public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId); @@ -68,4 +75,15 @@ internal sealed class TerritoryData public string? GetInstanceName(ushort instanceId) => _instanceNames.GetValueOrDefault(instanceId); public string? GetContentFinderConditionName(uint cfcId) => _contentFinderConditionNames.GetValueOrDefault(cfcId); + + public bool TryGetTerritoryIdForContentFinderCondition(uint cfcId, out uint territoryId) => + _contentFinderConditionIds.TryGetValue(cfcId, out territoryId); + + private static string FixName(string name, ClientLanguage language) + { + if (string.IsNullOrEmpty(name) || language != ClientLanguage.English) + return name; + + return string.Concat(name[0].ToString().ToUpper(CultureInfo.InvariantCulture), name.AsSpan(1)); + } } diff --git a/Questionable/External/AutoDutyIpc.cs b/Questionable/External/AutoDutyIpc.cs new file mode 100644 index 000000000..1089efcc3 --- /dev/null +++ b/Questionable/External/AutoDutyIpc.cs @@ -0,0 +1,89 @@ +using Dalamud.Plugin; +using Dalamud.Plugin.Ipc; +using Dalamud.Plugin.Ipc.Exceptions; +using Microsoft.Extensions.Logging; +using Questionable.Controller.Steps; +using Questionable.Data; + +namespace Questionable.External; + +internal sealed class AutoDutyIpc +{ + private readonly Configuration _configuration; + private readonly TerritoryData _territoryData; + private readonly ILogger _logger; + private readonly ICallGateSubscriber _contentHasPath; + private readonly ICallGateSubscriber _run; + private readonly ICallGateSubscriber _isStopped; + + public AutoDutyIpc(IDalamudPluginInterface pluginInterface, Configuration configuration, TerritoryData territoryData, ILogger logger) + { + _configuration = configuration; + _territoryData = territoryData; + _logger = logger; + _contentHasPath = pluginInterface.GetIpcSubscriber("AutoDuty.ContentHasPath"); + _run = pluginInterface.GetIpcSubscriber("AutoDuty.Run"); + _isStopped = pluginInterface.GetIpcSubscriber("AutoDuty.IsStopped"); + } + + public bool IsConfiguredToRunContent(uint? cfcId, bool autoDutyEnabled) + { + if (cfcId == null) + return false; + + if (!_configuration.Duties.RunInstancedContentWithAutoDuty) + return false; + + if (_configuration.Duties.BlacklistedDutyCfcIds.Contains(cfcId.Value)) + return false; + + if (_configuration.Duties.WhitelistedDutyCfcIds.Contains(cfcId.Value) && + _territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId.Value, out _)) + return true; + + return autoDutyEnabled && HasPath(cfcId.Value); + } + + public bool HasPath(uint cfcId) + { + if (!_territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId, out uint territoryType)) + return false; + + try + { + return _contentHasPath.InvokeFunc(territoryType); + } + catch (IpcError e) + { + _logger.LogWarning("Unable to query AutoDuty for path in territory {TerritoryType}: {Message}", territoryType, e.Message); + return false; + } + } + + public void StartInstance(uint cfcId) + { + if (!_territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId, out uint territoryType)) + throw new TaskException($"Unknown ContentFinderConditionId {cfcId}"); + + try + { + _run.InvokeAction(territoryType, 0, true); + } + catch (IpcError e) + { + throw new TaskException($"Unable to run content with AutoDuty: {e.Message}", e); + } + } + + public bool IsStopped() + { + try + { + return _isStopped.InvokeFunc(); + } + catch (IpcError) + { + return true; + } + } +} diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 5964eb45a..1072a54f2 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -129,6 +129,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); } private static void AddTaskFactories(ServiceCollection serviceCollection) @@ -178,7 +179,9 @@ public sealed class QuestionablePlugin : IDalamudPlugin .AddTaskFactoryAndExecutor(); serviceCollection.AddTaskFactoryAndExecutor(); serviceCollection.AddTaskFactoryAndExecutor(); - serviceCollection.AddTaskFactoryAndExecutor(); + serviceCollection.AddTaskFactoryAndExecutor(); + serviceCollection.AddTaskExecutor(); + serviceCollection.AddTaskExecutor(); serviceCollection.AddTaskFactory(); serviceCollection.AddTaskExecutor(); serviceCollection.AddTaskExecutor(); diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs index f44140846..eaf8f6226 100644 --- a/Questionable/Windows/ConfigWindow.cs +++ b/Questionable/Windows/ConfigWindow.cs @@ -1,7 +1,11 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; +using System.Numerics; +using System.Text; using Dalamud.Game.Text; +using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Components; using Dalamud.Interface.Utility.Raii; @@ -12,19 +16,28 @@ using ImGuiNET; using LLib.ImGui; using Lumina.Excel.Sheets; using Questionable.Controller; +using Questionable.Data; using Questionable.External; +using Questionable.Model; using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; namespace Questionable.Windows; internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig { + private const string DutyClipboardPrefix = "qst:duty:"; + private const string DutyClipboardSeparator = ";"; + private const string DutyWhitelistPrefix = "+"; + private const string DutyBlacklistPrefix = "-"; + private static readonly List<(uint Id, string Name)> DefaultMounts = [(0, "Mount Roulette")]; private readonly IDalamudPluginInterface _pluginInterface; private readonly NotificationMasterIpc _notificationMasterIpc; private readonly Configuration _configuration; private readonly CombatController _combatController; + private readonly QuestRegistry _questRegistry; + private readonly AutoDutyIpc _autoDutyIpc; private readonly uint[] _mountIds; private readonly string[] _mountNames; @@ -34,17 +47,38 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig private readonly string[] _grandCompanyNames = ["None (manually pick quest)", "Maelstrom", "Twin Adder", "Immortal Flames"]; + private readonly string[] _supportedCfcOptions = + [ + $"{SeIconChar.Circle.ToIconChar()} Enabled (Default)", + $"{SeIconChar.Circle.ToIconChar()} Enabled", + $"{SeIconChar.Cross.ToIconChar()} Disabled" + ]; + + private readonly string[] _unsupportedCfcOptions = + [ + $"{SeIconChar.Cross.ToIconChar()} Disabled (Default)", + $"{SeIconChar.Circle.ToIconChar()} Enabled", + $"{SeIconChar.Cross.ToIconChar()} Disabled" + ]; + + private readonly Dictionary> _contentFinderConditionNames; + public ConfigWindow(IDalamudPluginInterface pluginInterface, NotificationMasterIpc notificationMasterIpc, Configuration configuration, IDataManager dataManager, - CombatController combatController) + CombatController combatController, + TerritoryData territoryData, + QuestRegistry questRegistry, + AutoDutyIpc autoDutyIpc) : base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize) { _pluginInterface = pluginInterface; _notificationMasterIpc = notificationMasterIpc; _configuration = configuration; _combatController = combatController; + _questRegistry = questRegistry; + _autoDutyIpc = autoDutyIpc; var mounts = dataManager.GetExcelSheet() .Where(x => x is { RowId: > 0, Icon: > 0 }) @@ -54,10 +88,41 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig .ToList(); _mountIds = DefaultMounts.Select(x => x.Id).Concat(mounts.Select(x => x.MountId)).ToArray(); _mountNames = DefaultMounts.Select(x => x.Name).Concat(mounts.Select(x => x.Name)).ToArray(); + + _contentFinderConditionNames = dataManager.GetExcelSheet() + .Where(x => x.RowId > 0) + .Select(x => x.Content.ValueNullable) + .Where(x => x != null) + .Select(x => x!.Value) + .Select(x => new + { + Expansion = (EExpansionVersion)x.TerritoryType.Value.ExVersion.RowId, + CfcId = x.RowId, + Name = territoryData.GetContentFinderConditionName(x.RowId) ?? "?", + TerritoryId = x.TerritoryType.RowId, + ContentType = x.ContentType.RowId, + Level = x.ClassJobLevelRequired, + x.SortKey + }) + .GroupBy(x => x.Expansion) + .ToDictionary(x => x.Key, + x => x.OrderBy(y => y.Level) + .ThenBy(y => y.ContentType) + .ThenBy(y => y.SortKey) + .Select(y => new DutyInfo(y.CfcId, y.TerritoryId, $"{SeIconChar.LevelEn.ToIconChar()}{FormatLevel(y.Level)} {y.Name}")) + .ToList()); } public WindowConfig WindowConfig => _configuration.ConfigWindowConfig; + private static string FormatLevel(int level) + { + if (level == 0) + return string.Empty; + + return $"{FormatLevel(level / 10)}{(SeIconChar.Number0 + level % 10).ToIconChar()}"; + } + public override void Draw() { using var tabBar = ImRaii.TabBar("QuestionableConfigTabs"); @@ -65,6 +130,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig return; DrawGeneralTab(); + DrawDutiesTab(); DrawNotificationsTab(); DrawAdvancedTab(); } @@ -138,6 +204,175 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig } } + private void DrawDutiesTab() + { + using var tab = ImRaii.TabItem("Duties"); + if (!tab) + return; + + bool runInstancedContentWithAutoDuty = _configuration.Duties.RunInstancedContentWithAutoDuty; + if (ImGui.Checkbox("Run instanced content with AutoDuty and BossMod", ref runInstancedContentWithAutoDuty)) + { + _configuration.Duties.RunInstancedContentWithAutoDuty = runInstancedContentWithAutoDuty; + Save(); + } + + ImGui.SameLine(); + ImGuiComponents.HelpMarker( + "The combat module used for this is configured by AutoDuty, ignoring whichever selection you've made in Questionable's \"General\" configuration."); + + ImGui.Separator(); + + using (ImRaii.Disabled(!runInstancedContentWithAutoDuty)) + { + ImGui.Text( + "Questionable includes a default list of duties that work if AutoDuty and BossMod are installed."); + + ImGui.Text("The included list of duties can change with each update, and is based on the following spreadsheet:"); + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.GlobeEurope, "Open AutoDuty spreadsheet")) + Util.OpenLink( + "https://docs.google.com/spreadsheets/d/151RlpqRcCpiD_VbQn6Duf-u-S71EP7d0mx3j1PDNoNA/edit?pli=1#gid=0"); + + ImGui.Separator(); + ImGui.Text("You can override the dungeon settings for each individual dungeon/trial:"); + + using (var child = ImRaii.Child("DutyConfiguration", new Vector2(-1, 400), true)) + { + if (child) + { + foreach (EExpansionVersion expansion in Enum.GetValues()) + { + if (ImGui.CollapsingHeader(expansion.ToString())) + { + using var table = ImRaii.Table($"Duties{expansion}", 2, ImGuiTableFlags.SizingFixedFit); + if (table) + { + ImGui.TableSetupColumn("Name", ImGuiTableColumnFlags.WidthStretch); + ImGui.TableSetupColumn("Options", ImGuiTableColumnFlags.WidthFixed, 200f); + + if (_contentFinderConditionNames.TryGetValue(expansion, out var cfcNames)) + { + foreach (var (cfcId, territoryId, name) in cfcNames) + { + if (_questRegistry.TryGetDutyByContentFinderConditionId(cfcId, + out bool autoDutyEnabledByDefault)) + { + ImGui.TableNextRow(); + + string[] labels = autoDutyEnabledByDefault + ? _supportedCfcOptions + : _unsupportedCfcOptions; + int value = 0; + if (_configuration.Duties.WhitelistedDutyCfcIds.Contains(cfcId)) + value = 1; + if (_configuration.Duties.BlacklistedDutyCfcIds.Contains(cfcId)) + value = 2; + + if (ImGui.TableNextColumn()) + { + ImGui.AlignTextToFramePadding(); + ImGui.TextUnformatted(name); + if (ImGui.IsItemHovered() && _configuration.Advanced.AdditionalStatusInformation) + { + using var tooltip = ImRaii.Tooltip(); + if (tooltip) + { + ImGui.TextUnformatted(name); + ImGui.Separator(); + ImGui.BulletText($"TerritoryId: {territoryId}"); + ImGui.BulletText($"ContentFinderConditionId: {cfcId}"); + } + } + + if (runInstancedContentWithAutoDuty && !_autoDutyIpc.HasPath(cfcId)) + ImGuiComponents.HelpMarker("This duty is not supported by AutoDuty", FontAwesomeIcon.Times, ImGuiColors.DalamudRed); + } + + if (ImGui.TableNextColumn()) + { + using var _ = ImRaii.PushId($"##Dungeon{cfcId}"); + ImGui.SetNextItemWidth(200); + if (ImGui.Combo(string.Empty, ref value, labels, labels.Length)) + { + _configuration.Duties.WhitelistedDutyCfcIds.Remove(cfcId); + _configuration.Duties.BlacklistedDutyCfcIds.Remove(cfcId); + + if (value == 1) + _configuration.Duties.WhitelistedDutyCfcIds.Add(cfcId); + else if (value == 2) + _configuration.Duties.BlacklistedDutyCfcIds.Add(cfcId); + + Save(); + } + } + } + } + } + } + } + } + } + } + + using (ImRaii.Disabled(_configuration.Duties.WhitelistedDutyCfcIds.Count + + _configuration.Duties.BlacklistedDutyCfcIds.Count == 0)) + { + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Copy, "Export to clipboard")) + { + var whitelisted = + _configuration.Duties.WhitelistedDutyCfcIds.Select(x => $"{DutyWhitelistPrefix}{x}"); + var blacklisted = + _configuration.Duties.BlacklistedDutyCfcIds.Select(x => $"{DutyBlacklistPrefix}{x}"); + string text = DutyClipboardPrefix + Convert.ToBase64String(Encoding.UTF8.GetBytes( + string.Join(DutyClipboardSeparator, whitelisted.Concat(blacklisted)))); + ImGui.SetClipboardText(text); + } + } + + ImGui.SameLine(); + + string? clipboardText = GetClipboardText(); + using (ImRaii.Disabled(clipboardText == null || !clipboardText.StartsWith(DutyClipboardPrefix, StringComparison.InvariantCulture))) + { + if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Paste, "Import from Clipboard")) + { + clipboardText = clipboardText!.Substring(DutyClipboardPrefix.Length); + string text = Encoding.UTF8.GetString(Convert.FromBase64String(clipboardText)); + + _configuration.Duties.WhitelistedDutyCfcIds.Clear(); + _configuration.Duties.BlacklistedDutyCfcIds.Clear(); + foreach (string part in text.Split(DutyClipboardSeparator)) + { + if (part.StartsWith(DutyWhitelistPrefix, StringComparison.InvariantCulture) && + uint.TryParse(part.AsSpan(DutyWhitelistPrefix.Length), CultureInfo.InvariantCulture, + out uint whitelistedCfcId)) + _configuration.Duties.WhitelistedDutyCfcIds.Add(whitelistedCfcId); + + if (part.StartsWith(DutyBlacklistPrefix, StringComparison.InvariantCulture) && + uint.TryParse(part.AsSpan(DutyBlacklistPrefix.Length), CultureInfo.InvariantCulture, + out uint blacklistedCfcId)) + _configuration.Duties.WhitelistedDutyCfcIds.Add(blacklistedCfcId); + } + } + } + + ImGui.SameLine(); + + using (var unused = ImRaii.Disabled(!ImGui.IsKeyDown(ImGuiKey.ModCtrl))) + { + if (ImGui.Button("Reset to default")) + { + _configuration.Duties.WhitelistedDutyCfcIds.Clear(); + _configuration.Duties.BlacklistedDutyCfcIds.Clear(); + Save(); + } + } + + if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled)) + ImGui.SetTooltip("Hold CTRL to enable this button."); + } + } + private void DrawNotificationsTab() { using var tab = ImRaii.TabItem("Notifications"); @@ -231,4 +466,21 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig private void Save() => _pluginInterface.SavePluginConfig(_configuration); public void SaveWindowConfig() => Save(); + + /// + /// The default implementation for throws an NullReferenceException if the clipboard is empty, maybe also if it doesn't contain text. + /// + private unsafe string? GetClipboardText() + { + byte* ptr = ImGuiNative.igGetClipboardText(); + if (ptr == null) + return null; + + int byteCount = 0; + while (ptr[byteCount] != 0) + ++byteCount; + return Encoding.UTF8.GetString(ptr, byteCount); + } + + private sealed record DutyInfo(uint CfcId, uint TerritoryId, string Name); } From 8d3f37e6d4dca9f9d4358175216ef4eddc1fe84c Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 30 Dec 2024 02:50:39 +0100 Subject: [PATCH 050/109] Add Shaaloani gathering path --- .../Shaaloani/985_Eshceyaani Wilds_MIN.json | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 GatheringPaths/7.x - Dawntrail/Shaaloani/985_Eshceyaani Wilds_MIN.json diff --git a/GatheringPaths/7.x - Dawntrail/Shaaloani/985_Eshceyaani Wilds_MIN.json b/GatheringPaths/7.x - Dawntrail/Shaaloani/985_Eshceyaani Wilds_MIN.json new file mode 100644 index 000000000..238b65684 --- /dev/null +++ b/GatheringPaths/7.x - Dawntrail/Shaaloani/985_Eshceyaani Wilds_MIN.json @@ -0,0 +1,156 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "liza", + "Steps": [ + { + "TerritoryId": 1190, + "InteractionType": "None" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 34819, + "Locations": [ + { + "Position": { + "X": -86.69859, + "Y": -8.177663, + "Z": 572.7712 + }, + "MinimumAngle": 45, + "MaximumAngle": 175 + } + ] + }, + { + "DataId": 34820, + "Locations": [ + { + "Position": { + "X": -83.81214, + "Y": -8.291362, + "Z": 581.595 + }, + "MinimumAngle": 80, + "MaximumAngle": 175 + }, + { + "Position": { + "X": -88.70462, + "Y": -8.511888, + "Z": 578.6565 + }, + "MinimumAngle": 35, + "MaximumAngle": 150 + }, + { + "Position": { + "X": -81.00482, + "Y": -7.330131, + "Z": 574.7444 + }, + "MinimumAngle": 150, + "MaximumAngle": 245 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34817, + "Locations": [ + { + "Position": { + "X": -264.2871, + "Y": -21.57944, + "Z": 593.6306 + }, + "MinimumAngle": 130, + "MaximumAngle": 255, + "MinimumDistance": 1.5, + "MaximumDistance": 3 + } + ] + }, + { + "DataId": 34818, + "Locations": [ + { + "Position": { + "X": -266.9412, + "Y": -21.20901, + "Z": 593.9532 + }, + "MinimumAngle": 70, + "MaximumAngle": 225 + }, + { + "Position": { + "X": -268.0496, + "Y": -21.79604, + "Z": 598.2532 + }, + "MinimumAngle": -45, + "MaximumAngle": 160 + }, + { + "Position": { + "X": -260.2841, + "Y": -22.10003, + "Z": 595.726 + }, + "MinimumAngle": 160, + "MaximumAngle": 330 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34815, + "Locations": [ + { + "Position": { + "X": -276.2859, + "Y": -3.218076, + "Z": 437.6798 + } + } + ] + }, + { + "DataId": 34816, + "Locations": [ + { + "Position": { + "X": -277.8067, + "Y": -2.664376, + "Z": 433.8469 + } + }, + { + "Position": { + "X": -273.7089, + "Y": -2.972111, + "Z": 434.3939 + } + }, + { + "Position": { + "X": -281.1727, + "Y": -2.682134, + "Z": 433.9476 + } + } + ] + } + ] + } + ] +} \ No newline at end of file From cd6ef3c5f1a7adc71bf186bb3df4722e3f6e5bff Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 30 Dec 2024 15:57:55 +0100 Subject: [PATCH 051/109] Update sorting order for duties; exclude unsupported duties --- .../Dungeons/1131_Gilding the Bilious (Maelstrom).json | 3 +-- .../Dungeons/1132_Gilding the Bilious (Twin Adder).json | 3 +-- .../1133_Gilding the Bilious (Immortal Flames).json | 3 +-- .../2111_For All the Nights to Come.json | 3 +-- Questionable/Windows/ConfigWindow.cs | 7 +++---- 5 files changed, 7 insertions(+), 12 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json index 165a1839c..e0157efee 100644 --- a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1131_Gilding the Bilious (Maelstrom).json @@ -71,8 +71,7 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 5, - "AutoDutyEnabled": true + "ContentFinderConditionId": 5 } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json index 4defc6a91..178a0b5a4 100644 --- a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1132_Gilding the Bilious (Twin Adder).json @@ -71,8 +71,7 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 5, - "AutoDutyEnabled": true + "ContentFinderConditionId": 5 } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json index cf83d8a4c..8915d6714 100644 --- a/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Dungeons/1133_Gilding the Bilious (Immortal Flames).json @@ -71,8 +71,7 @@ { "TerritoryId": 155, "InteractionType": "Duty", - "ContentFinderConditionId": 5, - "AutoDutyEnabled": true + "ContentFinderConditionId": 5 } ] }, diff --git a/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json b/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json index 5961d3e18..5c9fa391d 100644 --- a/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json +++ b/QuestPaths/3.x - Heavensward/Aether Currents/Coerthas Western Highlands/2111_For All the Nights to Come.json @@ -38,8 +38,7 @@ { "TerritoryId": 397, "InteractionType": "Duty", - "ContentFinderConditionId": 36, - "AutoDutyEnabled": true + "ContentFinderConditionId": 36 } ] }, diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs index eaf8f6226..397faeba4 100644 --- a/Questionable/Windows/ConfigWindow.cs +++ b/Questionable/Windows/ConfigWindow.cs @@ -90,7 +90,8 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig _mountNames = DefaultMounts.Select(x => x.Name).Concat(mounts.Select(x => x.Name)).ToArray(); _contentFinderConditionNames = dataManager.GetExcelSheet() - .Where(x => x.RowId > 0) + .Where(x => x is { RowId: > 0, Unknown16: false }) + .OrderBy(x => x.Unknown15) // SortKey for the support UI .Select(x => x.Content.ValueNullable) .Where(x => x != null) .Select(x => x!.Value) @@ -106,9 +107,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig }) .GroupBy(x => x.Expansion) .ToDictionary(x => x.Key, - x => x.OrderBy(y => y.Level) - .ThenBy(y => y.ContentType) - .ThenBy(y => y.SortKey) + x => x .Select(y => new DutyInfo(y.CfcId, y.TerritoryId, $"{SeIconChar.LevelEn.ToIconChar()}{FormatLevel(y.Level)} {y.Name}")) .ToList()); } From b67a3abb6d6ec1f072c87138ce31d154df8beac3 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 30 Dec 2024 15:58:29 +0100 Subject: [PATCH 052/109] Version bump --- Directory.Build.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index e42241fe6..3ceabdbaf 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 4.10 + 4.11 From b91a34fdb0d00bfa545036e10e0cc0fc533fb491 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 31 Dec 2024 18:29:41 +0100 Subject: [PATCH 053/109] Add waypoint to 'The Resilient Son' --- .../4945_The Resilient Son.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json b/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json index 15817e8d1..738c87821 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json @@ -20,6 +20,16 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": -294.07196, + "Y": 44.504536, + "Z": -800.55725 + }, + "TerritoryId": 1191, + "InteractionType": "WalkTo", + "$": "IndexOutOfRangeException when trying to fly from the position you stand at for accepting the quest?" + }, { "DataId": 1048140, "Position": { From 070d7a2407607446c8663ef2d0f229bf8383b88e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 31 Dec 2024 23:30:49 +0100 Subject: [PATCH 054/109] Add some Sylph quests --- ...In the Sylphlands, Treasure Hunts You.json | 132 ++++++++++++++++++ .../Dailies/1275_Perilous Pumpkins.json | 79 +++++++++++ .../Sylphs/Dailies/1276_Fungal Foulness.json | 57 ++++++++ .../Controller/Steps/Interactions/Combat.cs | 8 +- .../Controller/Steps/Interactions/UseItem.cs | 4 +- 5 files changed, 276 insertions(+), 4 deletions(-) create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1274_In the Sylphlands, Treasure Hunts You.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1275_Perilous Pumpkins.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1276_Fungal Foulness.json diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1274_In the Sylphlands, Treasure Hunts You.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1274_In the Sylphlands, Treasure Hunts You.json new file mode 100644 index 000000000..0f61707f3 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1274_In the Sylphlands, Treasure Hunts You.json @@ -0,0 +1,132 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005562, + "Position": { + "X": 36.850464, + "Y": -4.8778634, + "Z": 249.19507 + }, + "TerritoryId": 152, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 321.08926, + "Y": -17.347095, + "Z": -201.61072 + }, + "TerritoryId": 152, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + } + }, + { + "DataId": 2003494, + "Position": { + "X": 319.44763, + "Y": -17.227417, + "Z": -200.88507 + }, + "TerritoryId": 152, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "ItemId": 2001154, + "GroundTarget": true, + "KillEnemyDataIds": [ + 764 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 2003041, + "Position": { + "X": 386.099, + "Y": -20.187744, + "Z": -200.763 + }, + "TerritoryId": 152, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "ItemId": 2001154, + "GroundTarget": true, + "KillEnemyDataIds": [ + 764 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 4 + ] + }, + { + "DataId": 2003040, + "Position": { + "X": 326.77185, + "Y": -18.112549, + "Z": -235.95032 + }, + "TerritoryId": 152, + "InteractionType": "Combat", + "EnemySpawnType": "AfterItemUse", + "ItemId": 2001154, + "GroundTarget": true, + "KillEnemyDataIds": [ + 764 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005562, + "Position": { + "X": 36.850464, + "Y": -4.8778634, + "Z": 249.19507 + }, + "TerritoryId": 152, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "East Shroud - Hawthorne Hut", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1275_Perilous Pumpkins.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1275_Perilous Pumpkins.json new file mode 100644 index 000000000..bc3713342 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1275_Perilous Pumpkins.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005562, + "Position": { + "X": 36.850464, + "Y": -4.8778634, + "Z": 249.19507 + }, + "TerritoryId": 152, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2003307, + "Position": { + "X": 261.82947, + "Y": -9.323303, + "Z": -72.80078 + }, + "TerritoryId": 152, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2003487, + "Position": { + "X": 429.89233, + "Y": -14.2977295, + "Z": -257.61804 + }, + "TerritoryId": 152, + "InteractionType": "Interact" + }, + { + "DataId": 2003310, + "Position": { + "X": 551.812, + "Y": -22.537598, + "Z": -352.13245 + }, + "TerritoryId": 152, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005562, + "Position": { + "X": 36.850464, + "Y": -4.8778634, + "Z": 249.19507 + }, + "TerritoryId": 152, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "East Shroud - Hawthorne Hut", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1276_Fungal Foulness.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1276_Fungal Foulness.json new file mode 100644 index 000000000..d03b0a2c0 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Sylphs/Dailies/1276_Fungal Foulness.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1005562, + "Position": { + "X": 36.850464, + "Y": -4.8778634, + "Z": 249.19507 + }, + "TerritoryId": 152, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 336.78577, + "Y": -17.169508, + "Z": -252.20335 + }, + "TerritoryId": 152, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [ + 2464 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1005562, + "Position": { + "X": 36.850464, + "Y": -4.8778634, + "Z": 249.19507 + }, + "TerritoryId": 152, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "East Shroud - Hawthorne Hut", + "Fly": true + } + ] + } + ] +} diff --git a/Questionable/Controller/Steps/Interactions/Combat.cs b/Questionable/Controller/Steps/Interactions/Combat.cs index c0a09a3af..a4d9594d0 100644 --- a/Questionable/Controller/Steps/Interactions/Combat.cs +++ b/Questionable/Controller/Steps/Interactions/Combat.cs @@ -45,8 +45,12 @@ internal static class Combat ArgumentNullException.ThrowIfNull(step.DataId); ArgumentNullException.ThrowIfNull(step.ItemId); - yield return new UseItem.UseOnObject(quest.Id, step.DataId.Value, step.ItemId.Value, - step.CompletionQuestVariablesFlags, true); + if (step.GroundTarget == true) + yield return new UseItem.UseOnGround(quest.Id, step.DataId.Value, step.ItemId.Value, + step.CompletionQuestVariablesFlags, true); + else + yield return new UseItem.UseOnObject(quest.Id, step.DataId.Value, step.ItemId.Value, + step.CompletionQuestVariablesFlags, true); yield return new WaitAtEnd.WaitDelay(TimeSpan.FromSeconds(1)); yield return CreateTask(quest, sequence, step); break; diff --git a/Questionable/Controller/Steps/Interactions/UseItem.cs b/Questionable/Controller/Steps/Interactions/UseItem.cs index e0753758e..118c204aa 100644 --- a/Questionable/Controller/Steps/Interactions/UseItem.cs +++ b/Questionable/Controller/Steps/Interactions/UseItem.cs @@ -211,9 +211,9 @@ internal static class UseItem ElementId? QuestId, uint DataId, uint ItemId, - IList CompletionQuestVariablesFlags) : IUseItemBase + IList CompletionQuestVariablesFlags, + bool StartingCombat = false) : IUseItemBase { - public bool StartingCombat => false; public override string ToString() => $"UseItem({ItemId} on ground at {DataId})"; } From 313677ac3fda346f528fb6fe82d16f65f2755a0a Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 1 Jan 2025 19:22:39 +0100 Subject: [PATCH 055/109] Add some Kobold quests --- .../Dailies/1339_Operation Riffraff.json | 212 +++++++++++++++++- .../Dailies/1344_A Dangerous Delivery.json | 40 +++- .../Dailies/1370_Spread the Wealth.json | 139 +++++++++++- 3 files changed, 387 insertions(+), 4 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json index e1d2e1859..68ec49150 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1339_Operation Riffraff.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,217 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 96.21657, + "Y": 55.28576, + "Z": -500.41245 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1005960, + "Position": { + "X": 97.3678, + "Y": 56.809326, + "Z": -502.06763 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1005960, + "Position": { + "X": 97.3678, + "Y": 56.809326, + "Z": -502.06763 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_BANKOB205_01339_SCENE00008_EVENTAREA_WARP_YESNO_TITLE", + "Yes": true + } + ] + }, + { + "DataId": 2003743, + "Position": { + "X": 227.00842, + "Y": 22.75116, + "Z": -582.81836 + }, + "TerritoryId": 180, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2003744, + "Position": { + "X": 224.78064, + "Y": 23.941406, + "Z": -580.9568 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001244, + "IgnoreDistanceToObject": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2003746, + "Position": { + "X": 239.30713, + "Y": 22.323914, + "Z": -577.29456 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2880 + ], + "CompletionQuestVariablesFlags": [ + { + "Low": 1 + }, + null, + null, + null, + null, + null + ] + }, + { + "DataId": 2003745, + "Position": { + "X": 242.8778, + "Y": 22.507019, + "Z": -584.37476 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2880 + ], + "CompletionQuestVariablesFlags": [ + { + "Low": 2 + }, + null, + null, + null, + null, + null + ] + }, + { + "DataId": 2003746, + "Position": { + "X": 239.30713, + "Y": 22.323914, + "Z": -577.29456 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2880 + ], + "CompletionQuestVariablesFlags": [ + { + "Low": 3 + }, + null, + null, + null, + null, + null + ] + }, + { + "DataId": 2003745, + "Position": { + "X": 242.8778, + "Y": 22.507019, + "Z": -584.37476 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2880 + ], + "CompletionQuestVariablesFlags": [ + { + "Low": 4 + }, + null, + null, + null, + null, + null + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2003746, + "Position": { + "X": 239.30713, + "Y": 22.323914, + "Z": -577.29456 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 2883 + ] + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1005932, + "Position": { + "X": -1.236023, + "Y": 33.38838, + "Z": -244.19019 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json index e1d2e1859..0394515bb 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1344_A Dangerous Delivery.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,45 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1005932, + "Position": { + "X": -1.236023, + "Y": 33.38838, + "Z": -244.19019 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_BANKOB210_01344_Q1_000_000", + "Answer": "TEXT_BANKOB210_01344_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2003963, + "Position": { + "X": 91.203125, + "Y": 55.74109, + "Z": -483.299 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Comment": "Spawns enemy that we ignore" + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json index b100ce645..ff87aaecc 100644 --- a/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json +++ b/QuestPaths/2.x - A Realm Reborn/Allied Societies/Kobolds/Dailies/1370_Spread the Wealth.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,140 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1005932, + "Position": { + "X": -1.236023, + "Y": 33.38838, + "Z": -244.19019 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2003911, + "Position": { + "X": 296.5896, + "Y": 21.499878, + "Z": -722.13324 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001278, + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "Position": { + "X": 296.5896, + "Y": 21.499878, + "Z": -722.13324 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "FinishCombatIfAny", + "KillEnemyDataIds": [ + 755 + ] + }, + { + "DataId": 2003910, + "Position": { + "X": 293.41565, + "Y": 21.499878, + "Z": -721.91956 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001278, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": 293.41565, + "Y": 21.499878, + "Z": -721.91956 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "FinishCombatIfAny", + "KillEnemyDataIds": [ + 755 + ] + }, + { + "DataId": 2003909, + "Position": { + "X": 290.0282, + "Y": 21.530457, + "Z": -721.3397 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001278, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 290.0282, + "Y": 21.530457, + "Z": -721.3397 + }, + "TerritoryId": 180, + "InteractionType": "Combat", + "EnemySpawnType": "FinishCombatIfAny", + "KillEnemyDataIds": [ + 755 + ] + }, + { + "DataId": 2003912, + "Position": { + "X": 295.76562, + "Y": 21.469421, + "Z": -711.9402 + }, + "TerritoryId": 180, + "InteractionType": "UseItem", + "ItemId": 2001279 + } + ] + }, { "Sequence": 255, "Steps": [ @@ -30,7 +163,9 @@ }, "TerritoryId": 180, "InteractionType": "CompleteQuest", - "Fly": true + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true, + "DelaySecondsAtStart": 3 } ] } From 40a25075736219b329614c7ad5377eb434d6f2a8 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 1 Jan 2025 19:23:12 +0100 Subject: [PATCH 056/109] Remove Aitiascope from list of default AD dungeons --- .../MSQ/F-Labyrinthos2/4449_Her Children One and All.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json b/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json index f41bf9552..749437457 100644 --- a/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json +++ b/QuestPaths/6.x - Endwalker/MSQ/F-Labyrinthos2/4449_Her Children One and All.json @@ -39,7 +39,7 @@ "TerritoryId": 956, "InteractionType": "Duty", "ContentFinderConditionId": 786, - "AutoDutyEnabled": true + "AutoDutyEnabled": false } ] }, From 13d1aff8f6948ccd6183221ca05dbea380c8d3bf Mon Sep 17 00:00:00 2001 From: Gwen Date: Thu, 2 Jan 2025 09:08:52 +0100 Subject: [PATCH 057/109] Add some side quests to unlock Triple Triad NPCs --- .../1021_What's It to U.json | 81 +++++++++ .../1022_Zombies Are People Too.json | 169 ++++++++++++++++++ .../1791_Feat of Clay.json | 73 ++++++++ .../1793_Yellow Stones.json | 115 ++++++++++++ .../1947_A Bum Rap.json | 62 +++++++ .../1964_What the Boat Brought In.json | 104 +++++++++++ .../1965_Over My Dead Gobbie.json | 112 ++++++++++++ .../Unlocks/Misc/3142_Secret of the Ooze.json | 85 +++++++++ 8 files changed, 801 insertions(+) create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1964_What the Boat Brought In.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1965_Over My Dead Gobbie.json create mode 100644 QuestPaths/4.x - Stormblood/Unlocks/Misc/3142_Secret of the Ooze.json diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json new file mode 100644 index 000000000..0c3628310 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json @@ -0,0 +1,81 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1004917, + "Position": { + "X": -358.6328, + "Y": 8.469424, + "Z": 422.4154 + }, + "TerritoryId": 146, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006602, + "Position": { + "X": -321.06506, + "Y": 8.830055, + "Z": 436.94202 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + }, + { + "DataId": 1006600, + "Position": { + "X": -283.5279, + "Y": 7.652629, + "Z": 423.14795 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + }, + { + "DataId": 1006599, + "Position": { + "X": -279.98785, + "Y": 15.013981, + "Z": 373.37292 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + }, + { + "DataId": 1006601, + "Position": { + "X": -293.53784, + "Y": 13.137939, + "Z": 354.63477 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1004917, + "Position": { + "X": -358.6328, + "Y": 8.469424, + "Z": 422.4154 + }, + "TerritoryId": 146, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json new file mode 100644 index 000000000..60c6be259 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json @@ -0,0 +1,169 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1004914, + "Position": { + "X": 167.89502, + "Y": 3.1102452, + "Z": 972.5642 + }, + "TerritoryId": 146, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1006603, + "Position": { + "X": -196.79565, + "Y": 78.11096, + "Z": 49.851196 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1004914, + "Position": { + "X": 167.89502, + "Y": 3.1102452, + "Z": 972.5642 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "AetheryteShortcut": "Southern Thanalan - Forgotten Springs", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -207.9934, + "Y": 66.78476, + "Z": -258.7822 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Outer La Noscea - Camp Overlook", + "Fly": true + },{ + "Position": { + "X": -234.89017, + "Y": 63.51318, + "Z": -255.7134 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "Position": { + "X": -356.22986, + "Y": 57.972702, + "Z": -381.27402 + }, + "TerritoryId": 180, + "InteractionType": "WalkTo", + "Fly": true + }, + + { + "DataId": 1006604, + "Position": { + "X": -278.73657, + "Y": 4.1657104, + "Z": -580.04126 + }, + "TerritoryId": 180, + "InteractionType": "Interact", + "Fly": true + } + + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1004914, + "Position": { + "X": 167.89502, + "Y": 3.1102452, + "Z": 972.5642 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "AetheryteShortcut": "Southern Thanalan - Forgotten Springs", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "InteractionType": "UseItem", + "ItemId": 2000779, + "GroundTarget": true, + "Position": { + "X": -192.67111, + "Y": 35.175262, + "Z": 129.13567 + }, + "TerritoryId": 146, + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1006605, + "Position": { + "X": -192.49261, + "Y": 35.210636, + "Z": 129.13708 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1004914, + "Position": { + "X": 167.89502, + "Y": 3.1102452, + "Z": 972.5642 + }, + "TerritoryId": 146, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json new file mode 100644 index 000000000..22b566e0f --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json @@ -0,0 +1,73 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1011931, + "Position": { + "X": 56.839844, + "Y": -49.92323, + "Z": -135.91211 + }, + "TerritoryId": 398, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2005617, + "Position": { + "X": 197.22278, + "Y": -99.931335, + "Z": 644.4646 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, null, + null, null, + null, 128 + ], + "Fly": true + }, + { + "DataId": 2005618, + "Position": { + "X": 287.64783, + "Y": -94.10242, + "Z": 597.9553 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, null, + null, null, + null, 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1011931, + "Position": { + "X": 56.839844, + "Y": -49.92323, + "Z": -135.91211 + }, + "TerritoryId": 398, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json new file mode 100644 index 000000000..7f58bbe58 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json @@ -0,0 +1,115 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1011931, + "Position": { + "X": 56.839844, + "Y": -49.92323, + "Z": -135.91211 + }, + "TerritoryId": 398, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2005636, + "Position": { + "X": -247.21143, + "Y": -77.62268, + "Z": 819.4857 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 2005635, + "Position": { + "X": -187.24353, + "Y": -84.85547, + "Z": 733.51636 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + + }, + { + "DataId": 2005633, + "Position": { + "X": -273.518, + "Y": -82.47504, + "Z": 644.6478 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2005634, + "Position": { + "X": -307.3015, + "Y": -80.1557, + "Z": 665.6748 + }, + "TerritoryId": 398, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + },{ + "Sequence": 255, + "Steps": [ + { + "DataId": 1011931, + "Position": { + "X": 56.839844, + "Y": -49.92323, + "Z": -135.91211 + }, + "TerritoryId": 398, + "Fly": true, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json new file mode 100644 index 000000000..b00954c43 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + + "Sequence": 0, + "Steps": [ + { + "DataId": 1012287, + "Position": { + "X": -28.397034, + "Y": 100.969696, + "Z": -186.4195 + }, + "TerritoryId": 399, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 301.43185, + "Y": 76.142914, + "Z": 171.03389 + }, + "TerritoryId": 399, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4020, + "MinimumKillCount": 3 + } + ], + "Fly": true + } + + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012287, + "Position": { + "X": -28.397034, + "Y": 100.969696, + "Z": -186.4195 + }, + "TerritoryId": 399, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1964_What the Boat Brought In.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1964_What the Boat Brought In.json new file mode 100644 index 000000000..43c1f337d --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1964_What the Boat Brought In.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013651, + "Position": { + "X": -475.76105, + "Y": 155.8605, + "Z": -209.76581 + }, + "TerritoryId": 399, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -654.5463, + "Y": 148.56897, + "Z": 187.12466 + }, + "TerritoryId": 399, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1013655, + "Position": { + "X": -669.9169, + "Y": 154.30952, + "Z": 191.08862 + }, + "Land": true, + "TerritoryId": 399, + "InteractionType": "Interact" + } + ] + }, + { + + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -894.6883, + "Y": 215.50499, + "Z": 157.66754 + }, + "TerritoryId": 399, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 5047, + "Position": { + "X": -894.9264, + "Y": 215.16266, + "Z": 155.29102 + }, + "TerritoryId": 399, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 5047, + 5048 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -654.5463, + "Y": 148.56897, + "Z": 187.12466 + }, + "TerritoryId": 399, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1013655, + "Position": { + "X": -669.9169, + "Y": 154.30952, + "Z": 191.08862 + }, + "Land": true, + "TerritoryId": 399, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1965_Over My Dead Gobbie.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1965_Over My Dead Gobbie.json new file mode 100644 index 000000000..10c60394c --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1965_Over My Dead Gobbie.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013655, + "Position": { + "X": -669.9169, + "Y": 154.30952, + "Z": 191.08862 + }, + "TerritoryId": 399, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1013656, + "Position": { + "X": -617.8836, + "Y": 150.38008, + "Z": 327.19922 + }, + "TerritoryId": 399, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1013659, + "Position": { + "X": -617.76154, + "Y": 153.8528, + "Z": 349.35522 + }, + "TerritoryId": 399, + "InteractionType": "Interact" + }, + { + "DataId": 5049, + "Position": { + "X": -617.76154, + "Y": 153.8528, + "Z": 349.35522 + }, + "TerritoryId": 399, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 5046, + 5049 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1013659, + "Position": { + "X": -617.76154, + "Y": 153.8528, + "Z": 349.35522 + }, + "TerritoryId": 399, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1013656, + "Position": { + "X": -617.8836, + "Y": 150.38008, + "Z": 327.19922 + }, + "TerritoryId": 399, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012133, + "Position": { + "X": -26.840637, + "Y": 206.49944, + "Z": 28.67163 + }, + "TerritoryId": 478, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Idyllshire" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Unlocks/Misc/3142_Secret of the Ooze.json b/QuestPaths/4.x - Stormblood/Unlocks/Misc/3142_Secret of the Ooze.json new file mode 100644 index 000000000..b57c78525 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Unlocks/Misc/3142_Secret of the Ooze.json @@ -0,0 +1,85 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1026200, + "Position": { + "X": 26.901611, + "Y": 0, + "Z": 36.362183 + }, + "TerritoryId": 635, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -516.5388, + "Y": 146.04834, + "Z": -357.0811 + }, + + "TerritoryId": 399, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Idyllshire", + "AethernetShortcut": [ + "[Idyllshire] Aetheryte Plaza", + "[Idyllshire] Prologue Gate (Western Hinterlands)" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InTerritory": [ + 399 + ] + } + } + }, + { + "DataId": 1026201, + "Position": { + "X": -617.2427, + "Y": 146.86842, + "Z": 62.150024 + }, + "TerritoryId": 399, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 399, + "InteractionType": "Duty", + "AutoDutyEnabled": true, + "ContentFinderConditionId": 62 + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1026202, + "Position": { + "X": -611.6274, + "Y": 146.86842, + "Z": 57.87744 + }, + "TerritoryId": 399, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file From c722abb6dfd479e8d38e9dda10d71571d1b3d3cb Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 2 Jan 2025 22:50:50 +0100 Subject: [PATCH 058/109] Automatically redeem untradeable mounts/minions/orchestrion rolls/TT cards/fashion accessories from quest rewards --- Questionable.sln.DotSettings | 1 + .../Steps/Shared/RedeemRewardItems.cs | 71 ++++++++++++ Questionable/Data/QuestData.cs | 8 ++ Questionable/Model/ItemReward.cs | 99 +++++++++++++++++ Questionable/Model/QuestInfo.cs | 17 ++- Questionable/QuestionablePlugin.cs | 9 +- .../JournalComponents/QuestRewardComponent.cs | 65 +++++++++++ Questionable/Windows/JournalProgressWindow.cs | 4 + .../QuestComponents/QuestTooltipComponent.cs | 105 +++++++++++------- 9 files changed, 332 insertions(+), 47 deletions(-) create mode 100644 Questionable/Controller/Steps/Shared/RedeemRewardItems.cs create mode 100644 Questionable/Model/ItemReward.cs create mode 100644 Questionable/Windows/JournalComponents/QuestRewardComponent.cs diff --git a/Questionable.sln.DotSettings b/Questionable.sln.DotSettings index 830879e07..ef6a1abd7 100644 --- a/Questionable.sln.DotSettings +++ b/Questionable.sln.DotSettings @@ -25,6 +25,7 @@ True True True + True True True True diff --git a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs new file mode 100644 index 000000000..4d11e72bb --- /dev/null +++ b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using Dalamud.Game.ClientState.Conditions; +using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.Game; +using Questionable.Data; +using Questionable.Functions; +using Questionable.Model; +using Questionable.Model.Questing; + +namespace Questionable.Controller.Steps.Shared; + +internal static class RedeemRewardItems +{ + internal sealed class Factory(QuestData questData) : ITaskFactory + { + public IEnumerable CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) + { + if (step.InteractionType != EInteractionType.AcceptQuest) + return []; + + List tasks = []; + unsafe + { + InventoryManager* inventoryManager = InventoryManager.Instance(); + if (inventoryManager == null) + return tasks; + + foreach (var itemReward in questData.RedeemableItems) + { + if (inventoryManager->GetInventoryItemCount(itemReward.ItemId) > 0 && + !itemReward.IsUnlocked()) + { + tasks.Add(new Task(itemReward)); + } + } + } + + return tasks; + } + } + + internal sealed record Task(ItemReward ItemReward) : ITask + { + public override string ToString() => $"TryRedeem({ItemReward.Name})"; + } + + internal sealed class Executor( + GameFunctions gameFunctions, + ICondition condition) : TaskExecutor + { + private DateTime _continueAt; + + protected override bool Start() + { + if (condition[ConditionFlag.Mounted]) + return false; + + _continueAt = DateTime.Now.Add(Task.ItemReward.CastTime).AddSeconds(1); + return gameFunctions.UseItem(Task.ItemReward.ItemId); + } + + public override ETaskResult Update() + { + if (condition[ConditionFlag.Casting]) + return ETaskResult.StillRunning; + + return DateTime.Now <= _continueAt ? ETaskResult.StillRunning : ETaskResult.TaskComplete; + } + } +} diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index 8f51c4991..7a3229a76 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; using System.Linq; using Dalamud.Plugin.Services; @@ -218,8 +219,15 @@ internal sealed class QuestData quest.JournalGenre = 82; quest.SortKey = 0; } + + RedeemableItems = quests.Where(x => x is QuestInfo) + .Cast() + .SelectMany(x => x.ItemRewards) + .ToImmutableHashSet(); } + public ImmutableHashSet RedeemableItems { get; } + private void AddPreviousQuest(QuestId questToUpdate, QuestId requiredQuestId) { QuestInfo quest = (QuestInfo)_quests[questToUpdate]; diff --git a/Questionable/Model/ItemReward.cs b/Questionable/Model/ItemReward.cs new file mode 100644 index 000000000..03044744e --- /dev/null +++ b/Questionable/Model/ItemReward.cs @@ -0,0 +1,99 @@ +using System; +using Dalamud.Utility; +using FFXIVClientStructs.FFXIV.Client.Game.UI; +using Lumina.Excel.Sheets; +using Questionable.Model.Questing; + +namespace Questionable.Model; + +public enum EItemRewardType +{ + Mount, + Minion, + OrchestrionRoll, + TripleTriadCard, + FashionAccessory, +} + +public sealed class ItemRewardDetails(Item item, ElementId elementId) +{ + public uint ItemId { get; } = item.RowId; + public string Name { get; } = item.Name.ToDalamudString().ToString(); + public TimeSpan CastTime { get; } = TimeSpan.FromSeconds(item.CastTimeSeconds); + public ElementId ElementId { get; } = elementId; +} + +public abstract record ItemReward(ItemRewardDetails Item) +{ + internal static ItemReward? CreateFromItem(Item item, ElementId elementId) + { + if (item.ItemAction.ValueNullable?.Type is 1322) + return new MountReward(new ItemRewardDetails(item, elementId), item.ItemAction.Value.Data[0]); + + if (item.ItemAction.ValueNullable?.Type is 853) + return new MinionReward(new ItemRewardDetails(item, elementId), item.ItemAction.Value.Data[0]); + + if (item.AdditionalData.GetValueOrDefault() is { } orchestrionRoll) + return new OrchestrionRollReward(new ItemRewardDetails(item, elementId), orchestrionRoll.RowId); + + if (item.AdditionalData.GetValueOrDefault() is { } tripleTriadCard) + return new TripleTriadCardReward(new ItemRewardDetails(item, elementId), (ushort)tripleTriadCard.RowId); + + if (item.ItemAction.ValueNullable?.Type is 20086) + return new FashionAccessoryReward(new ItemRewardDetails(item, elementId), item.ItemAction.Value.Data[0]); + + return null; + } + + public uint ItemId => Item.ItemId; + public string Name => Item.Name; + public ElementId ElementId => Item.ElementId; + public TimeSpan CastTime => Item.CastTime; + public abstract EItemRewardType Type { get; } + public abstract bool IsUnlocked(); +} + +public sealed record MountReward(ItemRewardDetails Item, uint MountId) + : ItemReward(Item) +{ + public override EItemRewardType Type => EItemRewardType.Mount; + + public override unsafe bool IsUnlocked() + => PlayerState.Instance()->IsMountUnlocked(MountId); +} + +public sealed record MinionReward(ItemRewardDetails Item, uint MinionId) + : ItemReward(Item) +{ + public override EItemRewardType Type => EItemRewardType.Minion; + + public override unsafe bool IsUnlocked() + => UIState.Instance()->IsCompanionUnlocked(MinionId); +} + +public sealed record OrchestrionRollReward(ItemRewardDetails Item, uint OrchestrionRollId) + : ItemReward(Item) +{ + public override EItemRewardType Type => EItemRewardType.OrchestrionRoll; + + public override unsafe bool IsUnlocked() => + PlayerState.Instance()->IsOrchestrionRollUnlocked(OrchestrionRollId); +} + +public sealed record TripleTriadCardReward(ItemRewardDetails Item, ushort TripleTriadCardId) + : ItemReward(Item) +{ + public override EItemRewardType Type => EItemRewardType.TripleTriadCard; + + public override unsafe bool IsUnlocked() => + UIState.Instance()->IsTripleTriadCardUnlocked(TripleTriadCardId); +} + +public sealed record FashionAccessoryReward(ItemRewardDetails Item, uint AccessoryId) + : ItemReward(Item) +{ + public override EItemRewardType Type => EItemRewardType.FashionAccessory; + + public override unsafe bool IsUnlocked() => + PlayerState.Instance()->IsOrnamentUnlocked(AccessoryId); +} diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index e34c16d7a..06c6dc34b 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -2,10 +2,11 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using FFXIVClientStructs.FFXIV.Client.UI.Agent; using LLib.GameData; +using Lumina.Excel.Sheets; using Questionable.Model.Questing; using ExcelQuest = Lumina.Excel.Sheets.Quest; +using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; namespace Questionable.Model; @@ -54,7 +55,8 @@ internal sealed class QuestInfo : IQuestInfo QuestLockJoin = (EQuestJoin)quest.QuestLockJoin; JournalGenre = quest.JournalGenre.ValueNullable?.RowId; SortKey = quest.SortKey; - IsMainScenarioQuest = quest.JournalGenre.ValueNullable?.JournalCategory.ValueNullable?.JournalSection.ValueNullable?.RowId is 0 or 1; + IsMainScenarioQuest = quest.JournalGenre.ValueNullable?.JournalCategory.ValueNullable?.JournalSection + .ValueNullable?.RowId is 0 or 1; CompletesInstantly = quest.TodoParams[0].ToDoCompleteSeq == 0; PreviousInstanceContent = quest.InstanceContent.Select(x => (ushort)x.RowId).Where(x => x != 0).ToList(); PreviousInstanceContentJoin = (EQuestJoin)quest.InstanceContentJoin; @@ -67,6 +69,15 @@ internal sealed class QuestInfo : IQuestInfo NewGamePlusChapter = newGamePlusChapter; StartingCity = startingCity; MoogleDeliveryLevel = (byte)quest.DeliveryQuest.RowId; + ItemRewards = quest.Reward.Where(x => x.RowId > 0 && x.Is()) + .Select(x => x.GetValueOrDefault()) + .Where(x => x != null) + .Cast() + .Where(x => x.IsUntradable) + .Select(x => ItemReward.CreateFromItem(x, QuestId)) + .Where(x => x != null) + .Cast() + .ToList(); Expansion = (EExpansionVersion)quest.Expansion.RowId; } @@ -79,7 +90,6 @@ internal sealed class QuestInfo : IQuestInfo }); } - public ElementId QuestId { get; } public string Name { get; } public ushort Level { get; } @@ -105,6 +115,7 @@ internal sealed class QuestInfo : IQuestInfo public byte StartingCity { get; set; } public byte MoogleDeliveryLevel { get; } public bool IsMoogleDeliveryQuest => JournalGenre == 87; + public IReadOnlyList ItemRewards { get; } public EExpansionVersion Expansion { get; } public void AddPreviousQuest(PreviousQuestInfo questId) diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 1072a54f2..f5fa51ee1 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -138,6 +138,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddTaskFactory(); serviceCollection .AddTaskExecutor(); + serviceCollection + .AddTaskFactoryAndExecutor(); serviceCollection.AddTaskExecutor(); serviceCollection.AddTaskExecutor(); serviceCollection.AddTaskFactoryAndExecutor(); serviceCollection - .AddTaskExecutor(); + .AddTaskExecutor(); serviceCollection .AddTaskFactoryAndExecutor(); serviceCollection.AddTaskFactoryAndExecutor(); @@ -179,7 +182,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin .AddTaskFactoryAndExecutor(); serviceCollection.AddTaskFactoryAndExecutor(); serviceCollection.AddTaskFactoryAndExecutor(); - serviceCollection.AddTaskFactoryAndExecutor(); + serviceCollection + .AddTaskFactoryAndExecutor(); serviceCollection.AddTaskExecutor(); serviceCollection.AddTaskExecutor(); serviceCollection.AddTaskFactory(); @@ -269,6 +273,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/Questionable/Windows/JournalComponents/QuestRewardComponent.cs b/Questionable/Windows/JournalComponents/QuestRewardComponent.cs new file mode 100644 index 000000000..2fab3109e --- /dev/null +++ b/Questionable/Windows/JournalComponents/QuestRewardComponent.cs @@ -0,0 +1,65 @@ +using System; +using System.Linq; +using Dalamud.Interface.Utility.Raii; +using ImGuiNET; +using Questionable.Data; +using Questionable.Model; +using Questionable.Windows.QuestComponents; + +namespace Questionable.Windows.JournalComponents; + +internal sealed class QuestRewardComponent +{ + private readonly QuestData _questData; + private readonly QuestTooltipComponent _questTooltipComponent; + private readonly UiUtils _uiUtils; + + public QuestRewardComponent( + QuestData questData, + QuestTooltipComponent questTooltipComponent, + UiUtils uiUtils) + { + _questData = questData; + _questTooltipComponent = questTooltipComponent; + _uiUtils = uiUtils; + } + + public void DrawItemRewards() + { + using var tab = ImRaii.TabItem("Item Rewards"); + if (!tab) + return; + + ImGui.BulletText("Only untradeable items are listed (you can e.g. sell your Wind-up Airship from the enovy quest)."); + + DrawGroup("Mounts", EItemRewardType.Mount); + DrawGroup("Minions", EItemRewardType.Minion); + DrawGroup("Orchestrion Rolls", EItemRewardType.OrchestrionRoll); + DrawGroup("Triple Triad Cards", EItemRewardType.TripleTriadCard); + DrawGroup("Fashion Accessories", EItemRewardType.FashionAccessory); + } + + private void DrawGroup(string label, EItemRewardType type) + { + if (!ImGui.CollapsingHeader($"{label}###Reward{type}")) + return; + + foreach (var item in _questData.RedeemableItems.Where(x => x.Type == type) + .OrderBy(x => x.Name, StringComparer.CurrentCultureIgnoreCase)) + { + if (_uiUtils.ChecklistItem(item.Name, item.IsUnlocked())) + { + if (_questData.TryGetQuestInfo(item.ElementId, out var questInfo)) + { + using var tooltip = ImRaii.Tooltip(); + if (!tooltip) + continue; + + ImGui.Text($"Obtained from: {questInfo.Name}"); + using (ImRaii.PushIndent()) + _questTooltipComponent.DrawInner(questInfo, false); + } + } + } + } +} diff --git a/Questionable/Windows/JournalProgressWindow.cs b/Questionable/Windows/JournalProgressWindow.cs index 6a5724a7e..e6d2a16d5 100644 --- a/Questionable/Windows/JournalProgressWindow.cs +++ b/Questionable/Windows/JournalProgressWindow.cs @@ -12,12 +12,14 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable { private readonly QuestJournalComponent _questJournalComponent; private readonly AlliedSocietyJournalComponent _alliedSocietyJournalComponent; + private readonly QuestRewardComponent _questRewardComponent; private readonly GatheringJournalComponent _gatheringJournalComponent; private readonly QuestRegistry _questRegistry; private readonly IClientState _clientState; public JournalProgressWindow( QuestJournalComponent questJournalComponent, + QuestRewardComponent questRewardComponent, AlliedSocietyJournalComponent alliedSocietyJournalComponent, GatheringJournalComponent gatheringJournalComponent, QuestRegistry questRegistry, @@ -26,6 +28,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable { _questJournalComponent = questJournalComponent; _alliedSocietyJournalComponent = alliedSocietyJournalComponent; + _questRewardComponent = questRewardComponent; _gatheringJournalComponent = gatheringJournalComponent; _questRegistry = questRegistry; _clientState = clientState; @@ -64,6 +67,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable _questJournalComponent.DrawQuests(); _alliedSocietyJournalComponent.DrawAlliedSocietyQuests(); + _questRewardComponent.DrawItemRewards(); _gatheringJournalComponent.DrawGatheringItems(); } diff --git a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs index bcf823ae6..e74beb2a1 100644 --- a/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs +++ b/Questionable/Windows/QuestComponents/QuestTooltipComponent.cs @@ -40,48 +40,58 @@ internal sealed class QuestTooltipComponent { using var tooltip = ImRaii.Tooltip(); if (tooltip) - { - ImGui.Text($"{SeIconChar.LevelEn.ToIconString()}{questInfo.Level}"); - ImGui.SameLine(); - - var (color, _, tooltipText) = _uiUtils.GetQuestStyle(questInfo.QuestId); - ImGui.TextColored(color, tooltipText); - if (questInfo.IsRepeatable) - { - ImGui.SameLine(); - ImGui.TextUnformatted("Repeatable"); - } - - if (questInfo is QuestInfo { CompletesInstantly: true }) - { - ImGui.SameLine(); - ImGui.TextUnformatted("Instant"); - } - - if (_questRegistry.TryGetQuest(questInfo.QuestId, out Quest? quest)) - { - if (quest.Root.Disabled) - { - ImGui.SameLine(); - ImGui.TextColored(ImGuiColors.DalamudRed, "Disabled"); - } - - if (quest.Root.Author.Count == 1) - ImGui.Text($"Author: {quest.Root.Author[0]}"); - else - ImGui.Text($"Authors: {string.Join(", ", quest.Root.Author)}"); - } - else - { - ImGui.SameLine(); - ImGui.TextColored(ImGuiColors.DalamudRed, "NoQuestPath"); - } - - DrawQuestUnlocks(questInfo, 0); - } + DrawInner(questInfo, true); } - private void DrawQuestUnlocks(IQuestInfo questInfo, int counter) + public void DrawInner(IQuestInfo questInfo, bool showItemRewards) + { + ImGui.Text($"{SeIconChar.LevelEn.ToIconString()}{questInfo.Level}"); + ImGui.SameLine(); + + var (color, _, tooltipText) = _uiUtils.GetQuestStyle(questInfo.QuestId); + ImGui.TextColored(color, tooltipText); + + if (questInfo is QuestInfo { IsSeasonalEvent: true }) + { + ImGui.SameLine(); + ImGui.TextUnformatted("Event"); + } + + if (questInfo.IsRepeatable) + { + ImGui.SameLine(); + ImGui.TextUnformatted("Repeatable"); + } + + if (questInfo is QuestInfo { CompletesInstantly: true }) + { + ImGui.SameLine(); + ImGui.TextUnformatted("Instant"); + } + + if (_questRegistry.TryGetQuest(questInfo.QuestId, out Quest? quest)) + { + if (quest.Root.Disabled) + { + ImGui.SameLine(); + ImGui.TextColored(ImGuiColors.DalamudRed, "Disabled"); + } + + if (quest.Root.Author.Count == 1) + ImGui.Text($"Author: {quest.Root.Author[0]}"); + else + ImGui.Text($"Authors: {string.Join(", ", quest.Root.Author)}"); + } + else + { + ImGui.SameLine(); + ImGui.TextColored(ImGuiColors.DalamudRed, "NoQuestPath"); + } + + DrawQuestUnlocks(questInfo, 0, showItemRewards); + } + + private void DrawQuestUnlocks(IQuestInfo questInfo, int counter, bool showItemRewards) { if (counter >= 10) return; @@ -118,12 +128,13 @@ internal sealed class QuestTooltipComponent _questFunctions.IsQuestComplete(q.QuestId) ? byte.MinValue : q.Sequence), iconColor, icon); if (qInfo is QuestInfo qstInfo && (counter <= 2 || icon != FontAwesomeIcon.Check)) - DrawQuestUnlocks(qstInfo, counter + 1); + DrawQuestUnlocks(qstInfo, counter + 1, false); } else { using var _ = ImRaii.Disabled(); - _uiUtils.ChecklistItem($"Unknown Quest ({q.QuestId})", ImGuiColors.DalamudGrey, FontAwesomeIcon.Question); + _uiUtils.ChecklistItem($"Unknown Quest ({q.QuestId})", ImGuiColors.DalamudGrey, + FontAwesomeIcon.Question); } } } @@ -193,6 +204,16 @@ internal sealed class QuestTooltipComponent GrandCompany currentGrandCompany = _questFunctions.GetGrandCompany(); _uiUtils.ChecklistItem($"Grand Company: {gcName}", actualQuestInfo.GrandCompany == currentGrandCompany); } + + if (showItemRewards && actualQuestInfo.ItemRewards.Count > 0) + { + ImGui.Separator(); + ImGui.Text("Item Rewards:"); + foreach (var reward in actualQuestInfo.ItemRewards) + { + ImGui.BulletText(reward.Name); + } + } } if (counter > 0) From 86964dd6f94e43c8b4f0ae44eee9a98deed35ebe Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 2 Jan 2025 22:51:16 +0100 Subject: [PATCH 059/109] Update aether current sequence in Kozama'uka --- .../5064_Ripe for the Offering.json | 25 ++++++------------- .../4869_The Lifting of Wings.json | 11 ++++++++ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json b/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json index a16039f32..585f5ba04 100644 --- a/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json +++ b/QuestPaths/7.x - Dawntrail/Aether Currents/Kozama'uka/5064_Ripe for the Offering.json @@ -94,23 +94,6 @@ } } }, - { - "DataId": 2013938, - "Position": { - "X": 516.80774, - "Y": 17.959839, - "Z": -348.0431 - }, - "TerritoryId": 1188, - "InteractionType": "AttuneAetherCurrent", - "AetherCurrentId": 2818425, - "AetheryteShortcut": "Kozama'uka - Dock Poga", - "SkipConditions": { - "AetheryteShortcutIf": { - "AetheryteLocked": "Kozama'uka - Dock Poga" - } - } - }, { "DataId": 1048826, "Position": { @@ -119,7 +102,13 @@ "Z": -527.36707 }, "TerritoryId": 1188, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Kozama'uka - Dock Poga", + "SkipConditions": { + "AetheryteShortcutIf": { + "AetheryteLocked": "Kozama'uka - Dock Poga" + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json b/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json index 7ac485400..afb87e815 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json @@ -84,6 +84,17 @@ "DisableNavmesh": true, "Mount": true }, + { + "DataId": 2013938, + "Position": { + "X": 516.80774, + "Y": 17.959839, + "Z": -348.0431 + }, + "TerritoryId": 1188, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818425 + }, { "DataId": 2013632, "Position": { From c0c2e324bbba2df5f87923e85fdf81620b757ce9 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 2 Jan 2025 23:25:40 +0100 Subject: [PATCH 060/109] Skip most of the framework update logic if no quest is running and quest window isn't visible --- Questionable/Controller/QuestController.cs | 5 +++++ Questionable/Windows/QuestWindow.cs | 1 + 2 files changed, 6 insertions(+) diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 5554404cf..9d17fed1d 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -146,6 +146,8 @@ internal sealed class QuestController : MiniTaskController, IDi public string? DebugState { get; private set; } + public Func IsQuestWindowOpen { private get; set; } = () => true; + public void Reload() { lock (_progressLock) @@ -181,6 +183,9 @@ internal sealed class QuestController : MiniTaskController, IDi } } + if (AutomationType == EAutomationType.Manual && !IsRunning && !IsQuestWindowOpen()) + return; + UpdateCurrentQuest(); if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious]) diff --git a/Questionable/Windows/QuestWindow.cs b/Questionable/Windows/QuestWindow.cs index 2bcdbf9d2..1463895a5 100644 --- a/Questionable/Windows/QuestWindow.cs +++ b/Questionable/Windows/QuestWindow.cs @@ -104,6 +104,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig _activeQuestComponent.Reload += OnReload; _quickAccessButtonsComponent.Reload += OnReload; + _questController.IsQuestWindowOpen = () => IsOpen; } public WindowConfig WindowConfig => _configuration.DebugWindowConfig; From 7023a1ac5f7fe51053fb09422e39b05bd52778d2 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 00:14:51 +0100 Subject: [PATCH 061/109] Add Heavensturn (2025) quest by Starr --- .../5186_Heavensssturn Trivia.json | 118 ++++++++++++++++++ .../QuestComponents/EventInfoComponent.cs | 2 +- 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 QuestPaths/7.x - Dawntrail/Seasonal Events/Heavensturn (2025)/5186_Heavensssturn Trivia.json diff --git a/QuestPaths/7.x - Dawntrail/Seasonal Events/Heavensturn (2025)/5186_Heavensssturn Trivia.json b/QuestPaths/7.x - Dawntrail/Seasonal Events/Heavensturn (2025)/5186_Heavensssturn Trivia.json new file mode 100644 index 000000000..d6623a1b5 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Seasonal Events/Heavensturn (2025)/5186_Heavensssturn Trivia.json @@ -0,0 +1,118 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Starr", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050356, + "Position": { + "X": 17.288391, + "Y": 45.656, + "Z": 133.95886 + }, + "TerritoryId": 128, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InTerritory": [ + 128 + ] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1050357, + "Position": { + "X": -4.6845703, + "Y": 40.000004, + "Z": 73.3501 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Prompt": "TEXT_FESNYX101_05186_Q1_000_000", + "Answer": "TEXT_FESNYX101_05186_A1_000_000", + "Type": "List" + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1050358, + "Position": { + "X": -18.143005, + "Y": 44, + "Z": -33.49359 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Prompt": "TEXT_FESNYX101_05186_Q2_000_000", + "Answer": "TEXT_FESNYX101_05186_A2_000_001", + "Type": "List" + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1050359, + "Position": { + "X": -44.235962, + "Y": 39.473606, + "Z": -163.77509 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Prompt": "TEXT_FESNYX101_05186_Q3_000_000", + "Answer": "TEXT_FESNYX101_05186_A3_000_000", + "Type": "List" + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050356, + "Position": { + "X": 17.288391, + "Y": 45.656, + "Z": 133.95886 + }, + "TerritoryId": 128, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Limsa Lominsa] Culinarians' Guild", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + } + ] +} diff --git a/Questionable/Windows/QuestComponents/EventInfoComponent.cs b/Questionable/Windows/QuestComponents/EventInfoComponent.cs index 9325efa2f..698d98d4c 100644 --- a/Questionable/Windows/QuestComponents/EventInfoComponent.cs +++ b/Questionable/Windows/QuestComponents/EventInfoComponent.cs @@ -22,7 +22,7 @@ internal sealed class EventInfoComponent [SuppressMessage("ReSharper", "CollectionNeverUpdated.Local")] private readonly List _eventQuests = [ - new("Starlight Celebration", [new(5227), new(5228)], AtDailyReset(new(2024, 12, 31))), + new("Heavensturn", [new(5186)], AtDailyReset(new(2025, 1, 16))), ]; private readonly QuestData _questData; From 58185d418c9e5c621b0c515911701988d52c14a6 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 00:40:06 +0100 Subject: [PATCH 062/109] Add a few Gold Saucer unlock quests by Starr --- .../Gold Saucer/3081_Passion for Fashion.json | 42 ++++++++++++++ ...very Little Thing She Does Is Mahjong.json | 46 +++++++++++++++ .../436_So You Want to Be a Jockey.json | 57 +++++++++++++++++++ .../Gold Saucer/437_Triple Triad Trial.json | 34 +++++++++++ ...o You Think You Can Ride This Chocobo.json | 55 ++++++++++++++++++ 5 files changed, 234 insertions(+) create mode 100644 QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3081_Passion for Fashion.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3201_Every Little Thing She Does Is Mahjong.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/436_So You Want to Be a Jockey.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/437_Triple Triad Trial.json create mode 100644 QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/565_So You Think You Can Ride This Chocobo.json diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3081_Passion for Fashion.json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3081_Passion for Fashion.json new file mode 100644 index 000000000..04db319da --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3081_Passion for Fashion.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Starr", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1011145, + "Position": { + "X": -65.38495, + "Y": 0.06979119, + "Z": 0.8086548 + }, + "TerritoryId": 144, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gold Saucer", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025176, + "Position": { + "X": 57.99951, + "Y": 3.9997258, + "Z": 64.774536 + }, + "TerritoryId": 144, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3201_Every Little Thing She Does Is Mahjong.json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3201_Every Little Thing She Does Is Mahjong.json new file mode 100644 index 000000000..1c0e99050 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/3201_Every Little Thing She Does Is Mahjong.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Starr", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1011145, + "Position": { + "X": -65.38495, + "Y": 0.06979119, + "Z": 0.8086548 + }, + "TerritoryId": 144, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gold Saucer", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1016307, + "Position": { + "X": 57.14502, + "Y": 20.99973, + "Z": 83.57361 + }, + "TerritoryId": 144, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Gold Saucer] Aetheryte Plaza", + "[Gold Saucer] Wonder Square East" + ] + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/436_So You Want to Be a Jockey.json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/436_So You Want to Be a Jockey.json new file mode 100644 index 000000000..0cd04e865 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/436_So You Want to Be a Jockey.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Starr", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1010464, + "Position": { + "X": -0.015319824, + "Y": -1.8903663E-06, + "Z": -65.61273 + }, + "TerritoryId": 388, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gold Saucer", + "AethernetShortcut": [ + "[Gold Saucer] Aetheryte Plaza", + "[Gold Saucer] Chocobo Square" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 144 + ] + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1010472, + "Position": { + "X": -53.26935, + "Y": 0.3093315, + "Z": 69.41321 + }, + "TerritoryId": 148, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, + "Fly": true, + "NextQuestId": 565 + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/437_Triple Triad Trial.json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/437_Triple Triad Trial.json new file mode 100644 index 000000000..de58efed8 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/437_Triple Triad Trial.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Starr", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1011060, + "Position": { + "X": -96.87958, + "Y": -0.86297023, + "Z": 67.826294 + }, + "TerritoryId": 144, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gold Saucer", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, + "DialogueChoices": [ + { + "Type": "YesNo", + "Yes": true, + "Prompt": "TEXT_SUBGSC102_00437_Q1_000_000" + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/565_So You Think You Can Ride This Chocobo.json b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/565_So You Think You Can Ride This Chocobo.json new file mode 100644 index 000000000..af58abfac --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Unlocks/Gold Saucer/565_So You Think You Can Ride This Chocobo.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Starr", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1010472, + "Position": { + "X": -53.26935, + "Y": 0.3093315, + "Z": 69.41321 + }, + "TerritoryId": 148, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1010464, + "Position": { + "X": -0.015319824, + "Y": -1.8903663E-06, + "Z": -65.61273 + }, + "TerritoryId": 388, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Gold Saucer", + "AethernetShortcut": [ + "[Gold Saucer] Aetheryte Plaza", + "[Gold Saucer] Chocobo Square" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InTerritory": [ + 388, + 144 + ] + } + } + } + ] + } + ] +} From 0a35ea3eaa5b0066e3ebae2e99122e990f58476d Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 01:11:25 +0100 Subject: [PATCH 063/109] Add filter to exclude event rewards --- .../JournalComponents/QuestRewardComponent.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/Questionable/Windows/JournalComponents/QuestRewardComponent.cs b/Questionable/Windows/JournalComponents/QuestRewardComponent.cs index 2fab3109e..cbb3af7d8 100644 --- a/Questionable/Windows/JournalComponents/QuestRewardComponent.cs +++ b/Questionable/Windows/JournalComponents/QuestRewardComponent.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using Dalamud.Game.Text; using Dalamud.Interface.Utility.Raii; using ImGuiNET; using Questionable.Data; @@ -14,6 +15,8 @@ internal sealed class QuestRewardComponent private readonly QuestTooltipComponent _questTooltipComponent; private readonly UiUtils _uiUtils; + private bool _showEventRewards; + public QuestRewardComponent( QuestData questData, QuestTooltipComponent questTooltipComponent, @@ -30,7 +33,10 @@ internal sealed class QuestRewardComponent if (!tab) return; - ImGui.BulletText("Only untradeable items are listed (you can e.g. sell your Wind-up Airship from the enovy quest)."); + ImGui.Checkbox("Show rewards from seasonal event quests", ref _showEventRewards); + ImGui.Spacing(); + + ImGui.BulletText("Only untradeable items are listed (e.g. the Wind-up Airship can be sold on the market board)."); DrawGroup("Mounts", EItemRewardType.Mount); DrawGroup("Minions", EItemRewardType.Minion); @@ -47,9 +53,17 @@ internal sealed class QuestRewardComponent foreach (var item in _questData.RedeemableItems.Where(x => x.Type == type) .OrderBy(x => x.Name, StringComparer.CurrentCultureIgnoreCase)) { - if (_uiUtils.ChecklistItem(item.Name, item.IsUnlocked())) + if (_questData.TryGetQuestInfo(item.ElementId, out var questInfo)) { - if (_questData.TryGetQuestInfo(item.ElementId, out var questInfo)) + bool isEventQuest = questInfo is QuestInfo { IsSeasonalEvent: true }; + if (!_showEventRewards && isEventQuest) + continue; + + string name = item.Name; + if (isEventQuest) + name += $" {SeIconChar.Clock.ToIconString()}"; + + if (_uiUtils.ChecklistItem(name, item.IsUnlocked())) { using var tooltip = ImRaii.Tooltip(); if (!tooltip) From 6a29273c793cc2daa292e4d49bb44223efb755d1 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 01:24:51 +0100 Subject: [PATCH 064/109] Update LLib --- LLib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LLib b/LLib index 783fea977..b10598711 160000 --- a/LLib +++ b/LLib @@ -1 +1 @@ -Subproject commit 783fea977a2524dd63e717367fc026c52efe6c23 +Subproject commit b1059871154b84401020c0072fd089fcc022fb77 From 9aa07afff89c05e434b58e09562ae777907623da Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 01:46:31 +0100 Subject: [PATCH 065/109] Don't try queueing for duties when ilvl is too low --- .../Steps/Common/SendNotification.cs | 2 +- .../Controller/Steps/Interactions/Duty.cs | 48 ++++++++++++++++--- Questionable/Data/TerritoryData.cs | 35 +++++++++----- Questionable/External/AutoDutyIpc.cs | 12 ++--- Questionable/QuestionablePlugin.cs | 3 ++ Questionable/Windows/ConfigWindow.cs | 2 +- 6 files changed, 75 insertions(+), 27 deletions(-) diff --git a/Questionable/Controller/Steps/Common/SendNotification.cs b/Questionable/Controller/Steps/Common/SendNotification.cs index e83a1186c..cf116028e 100644 --- a/Questionable/Controller/Steps/Common/SendNotification.cs +++ b/Questionable/Controller/Steps/Common/SendNotification.cs @@ -24,7 +24,7 @@ internal static class SendNotification new Task(step.InteractionType, step.Comment), EInteractionType.Duty when !autoDutyIpc.IsConfiguredToRunContent(step.ContentFinderConditionId, step.AutoDutyEnabled) => new Task(step.InteractionType, step.ContentFinderConditionId.HasValue - ? territoryData.GetContentFinderConditionName(step.ContentFinderConditionId.Value) + ? territoryData.GetContentFinderCondition(step.ContentFinderConditionId.Value)?.Name : step.Comment), EInteractionType.SinglePlayerDuty => new Task(step.InteractionType, quest.Info.Name), _ => null, diff --git a/Questionable/Controller/Steps/Interactions/Duty.cs b/Questionable/Controller/Steps/Interactions/Duty.cs index fab5c6ed3..5e20accf0 100644 --- a/Questionable/Controller/Steps/Interactions/Duty.cs +++ b/Questionable/Controller/Steps/Interactions/Duty.cs @@ -2,6 +2,9 @@ using System.Collections.Generic; using Dalamud.Game.ClientState.Conditions; using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.Game; +using LLib.Gear; +using Questionable.Controller.Steps.Common; using Questionable.Controller.Steps.Shared; using Questionable.Data; using Questionable.External; @@ -41,23 +44,54 @@ internal static class Duty } internal sealed class StartAutoDutyExecutor( + GearStatsCalculator gearStatsCalculator, AutoDutyIpc autoDutyIpc, TerritoryData territoryData, - IClientState clientState) : TaskExecutor + IClientState clientState, + IChatGui chatGui, + SendNotification.Executor sendNotificationExecutor) : TaskExecutor { protected override bool Start() { + if (!territoryData.TryGetContentFinderCondition(Task.ContentFinderConditionId, + out var cfcData)) + throw new TaskException("Failed to get territory ID for content finder condition"); + + unsafe + { + InventoryManager* inventoryManager = InventoryManager.Instance(); + if (inventoryManager == null) + throw new TaskException("Inventory unavailable"); + + var equippedItems = inventoryManager->GetInventoryContainer(InventoryType.EquippedItems); + if (equippedItems == null) + throw new TaskException("Equipped items unavailable"); + + var currentItemLevel = gearStatsCalculator.CalculateAverageItemLevel(equippedItems); + if (cfcData.RequiredItemLevel > currentItemLevel) + { + string errorText = + $"Could not use AutoDuty to queue for {cfcData.Name}, required item level: {cfcData.RequiredItemLevel}, current item level: {currentItemLevel}."; + if (!sendNotificationExecutor.Start(new SendNotification.Task(EInteractionType.Duty, errorText))) + chatGui.PrintError(errorText, CommandHandler.MessageTag, CommandHandler.TagColor); + + return false; + } + } + autoDutyIpc.StartInstance(Task.ContentFinderConditionId); return true; } public override ETaskResult Update() { - if (!territoryData.TryGetTerritoryIdForContentFinderCondition(Task.ContentFinderConditionId, - out uint territoryId)) + if (!territoryData.TryGetContentFinderCondition(Task.ContentFinderConditionId, + out var cfcData)) throw new TaskException("Failed to get territory ID for content finder condition"); - return clientState.TerritoryType == territoryId ? ETaskResult.TaskComplete : ETaskResult.StillRunning; + return clientState.TerritoryType == cfcData.TerritoryId + ? ETaskResult.TaskComplete + : ETaskResult.StillRunning; } } @@ -75,11 +109,11 @@ internal static class Duty public override ETaskResult Update() { - if (!territoryData.TryGetTerritoryIdForContentFinderCondition(Task.ContentFinderConditionId, - out uint territoryId)) + if (!territoryData.TryGetContentFinderCondition(Task.ContentFinderConditionId, + out var cfcData)) throw new TaskException("Failed to get territory ID for content finder condition"); - return clientState.TerritoryType != territoryId && autoDutyIpc.IsStopped() + return clientState.TerritoryType != cfcData.TerritoryId && autoDutyIpc.IsStopped() ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } diff --git a/Questionable/Data/TerritoryData.cs b/Questionable/Data/TerritoryData.cs index 970718b2f..f269b138a 100644 --- a/Questionable/Data/TerritoryData.cs +++ b/Questionable/Data/TerritoryData.cs @@ -1,12 +1,11 @@ using System; -using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; using Dalamud.Game; using Dalamud.Plugin.Services; using Dalamud.Utility; -using FFXIVClientStructs.FFXIV.Client.Game.Character; using Lumina.Excel.Sheets; namespace Questionable.Data; @@ -17,8 +16,7 @@ internal sealed class TerritoryData private readonly ImmutableHashSet _territoriesWithMount; private readonly ImmutableDictionary _dutyTerritories; private readonly ImmutableDictionary _instanceNames; - private readonly ImmutableDictionary _contentFinderConditionNames; - private readonly ImmutableDictionary _contentFinderConditionIds; + private readonly ImmutableDictionary _contentFinderConditions; public TerritoryData(IDataManager dataManager) { @@ -46,12 +44,10 @@ internal sealed class TerritoryData .Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6) .ToImmutableDictionary(x => x.Content.RowId, x => x.Name.ToDalamudString().ToString()); - _contentFinderConditionNames = dataManager.GetExcelSheet() + _contentFinderConditions = dataManager.GetExcelSheet() .Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6) - .ToImmutableDictionary(x => x.RowId, x => FixName(x.Name.ToDalamudString().ToString(), dataManager.Language)); - _contentFinderConditionIds = dataManager.GetExcelSheet() - .Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6) - .ToImmutableDictionary(x => x.RowId, x => x.TerritoryType.RowId); + .Select(x => new ContentFinderConditionData(x, dataManager.Language)) + .ToImmutableDictionary(x => x.ContentFinderConditionId, x => x); } public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId); @@ -74,10 +70,12 @@ internal sealed class TerritoryData public string? GetInstanceName(ushort instanceId) => _instanceNames.GetValueOrDefault(instanceId); - public string? GetContentFinderConditionName(uint cfcId) => _contentFinderConditionNames.GetValueOrDefault(cfcId); + public ContentFinderConditionData? GetContentFinderCondition(uint cfcId) => + _contentFinderConditions.GetValueOrDefault(cfcId); - public bool TryGetTerritoryIdForContentFinderCondition(uint cfcId, out uint territoryId) => - _contentFinderConditionIds.TryGetValue(cfcId, out territoryId); + public bool TryGetContentFinderCondition(uint cfcId, + [NotNullWhen(true)] out ContentFinderConditionData? contentFinderConditionData) => + _contentFinderConditions.TryGetValue(cfcId, out contentFinderConditionData); private static string FixName(string name, ClientLanguage language) { @@ -86,4 +84,17 @@ internal sealed class TerritoryData return string.Concat(name[0].ToString().ToUpper(CultureInfo.InvariantCulture), name.AsSpan(1)); } + + public sealed record ContentFinderConditionData( + uint ContentFinderConditionId, + string Name, + uint TerritoryId, + ushort RequiredItemLevel) + { + public ContentFinderConditionData(ContentFinderCondition condition, ClientLanguage clientLanguage) + : this(condition.RowId, FixName(condition.Name.ToDalamudString().ToString(), clientLanguage), + condition.TerritoryType.RowId, condition.ItemLevelRequired) + { + } + } } diff --git a/Questionable/External/AutoDutyIpc.cs b/Questionable/External/AutoDutyIpc.cs index 1089efcc3..71bae7fd1 100644 --- a/Questionable/External/AutoDutyIpc.cs +++ b/Questionable/External/AutoDutyIpc.cs @@ -38,7 +38,7 @@ internal sealed class AutoDutyIpc return false; if (_configuration.Duties.WhitelistedDutyCfcIds.Contains(cfcId.Value) && - _territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId.Value, out _)) + _territoryData.TryGetContentFinderCondition(cfcId.Value, out _)) return true; return autoDutyEnabled && HasPath(cfcId.Value); @@ -46,28 +46,28 @@ internal sealed class AutoDutyIpc public bool HasPath(uint cfcId) { - if (!_territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId, out uint territoryType)) + if (!_territoryData.TryGetContentFinderCondition(cfcId, out var cfcData)) return false; try { - return _contentHasPath.InvokeFunc(territoryType); + return _contentHasPath.InvokeFunc(cfcData.TerritoryId); } catch (IpcError e) { - _logger.LogWarning("Unable to query AutoDuty for path in territory {TerritoryType}: {Message}", territoryType, e.Message); + _logger.LogWarning("Unable to query AutoDuty for path in territory {TerritoryType}: {Message}", cfcData.TerritoryId, e.Message); return false; } } public void StartInstance(uint cfcId) { - if (!_territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId, out uint territoryType)) + if (!_territoryData.TryGetContentFinderCondition(cfcId, out var cfcData)) throw new TaskException($"Unknown ContentFinderConditionId {cfcId}"); try { - _run.InvokeAction(territoryType, 0, true); + _run.InvokeAction(cfcData.TerritoryId, 0, true); } catch (IpcError e) { diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index f5fa51ee1..a4b5bae9e 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -7,6 +7,7 @@ using Dalamud.Interface.Windowing; using Dalamud.Plugin; using Dalamud.Plugin.Services; using LLib; +using LLib.Gear; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Questionable.Controller; @@ -130,6 +131,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + + serviceCollection.AddSingleton(); } private static void AddTaskFactories(ServiceCollection serviceCollection) diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs index 397faeba4..131f3726d 100644 --- a/Questionable/Windows/ConfigWindow.cs +++ b/Questionable/Windows/ConfigWindow.cs @@ -99,7 +99,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig { Expansion = (EExpansionVersion)x.TerritoryType.Value.ExVersion.RowId, CfcId = x.RowId, - Name = territoryData.GetContentFinderConditionName(x.RowId) ?? "?", + Name = territoryData.GetContentFinderCondition(x.RowId)?.Name ?? "?", TerritoryId = x.TerritoryType.RowId, ContentType = x.ContentType.RowId, Level = x.ClassJobLevelRequired, From 341c751f0c5fc4384b2b8a613264fc957936373b Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 02:22:06 +0100 Subject: [PATCH 066/109] Minor quest adjustments --- .../1021_What's It to U.json | 42 +++++++-- .../1022_Zombies Are People Too.json | 5 +- .../1553_Can't Do It without U.json | 87 +++++++++++++++++++ .../1791_Feat of Clay.json | 31 ++++--- .../1793_Yellow Stones.json | 15 ++-- .../1947_A Bum Rap.json | 5 +- .../3142_Secret of the Ooze.json | 5 +- 7 files changed, 162 insertions(+), 28 deletions(-) create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/The Waking Sands/1553_Can't Do It without U.json rename QuestPaths/4.x - Stormblood/Unlocks/{Misc => Dungeons}/3142_Secret of the Ooze.json (95%) diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json index 0c3628310..259f27ceb 100644 --- a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1021_What's It to U.json @@ -28,7 +28,15 @@ "Z": 436.94202 }, "TerritoryId": 146, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] }, { "DataId": 1006600, @@ -38,7 +46,15 @@ "Z": 423.14795 }, "TerritoryId": 146, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] }, { "DataId": 1006599, @@ -48,7 +64,15 @@ "Z": 373.37292 }, "TerritoryId": 146, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] }, { "DataId": 1006601, @@ -58,7 +82,15 @@ "Z": 354.63477 }, "TerritoryId": 146, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] } ] }, @@ -78,4 +110,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json index 60c6be259..01f2002da 100644 --- a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Southern Thanalan/1022_Zombies Are People Too.json @@ -13,7 +13,8 @@ "Z": 972.5642 }, "TerritoryId": 146, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "Fly": true } ] }, @@ -166,4 +167,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/The Waking Sands/1553_Can't Do It without U.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/The Waking Sands/1553_Can't Do It without U.json new file mode 100644 index 000000000..caf53c576 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/The Waking Sands/1553_Can't Do It without U.json @@ -0,0 +1,87 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "TerritoryId": 132, + "InteractionType": "UseItem", + "ItemId": 30362, + "TargetTerritoryId": 140, + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 140, + 212 + ] + } + } + }, + { + "Position": { + "X": -492.96475, + "Y": 20.999884, + "Z": -380.82272 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo", + "$": "Avoid walking around Waking Sands table", + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 212 + ] + } + } + }, + { + "DataId": 2001711, + "Position": { + "X": -480.9181, + "Y": 18.00103, + "Z": -386.862 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "TargetTerritoryId": 212, + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 212 + ] + } + } + }, + { + "DataId": 1011618, + "Position": { + "X": 10.330261, + "Y": -3.0000017, + "Z": -54.8562 + }, + "TerritoryId": 212, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1004917, + "Position": { + "X": -358.6328, + "Y": 8.469424, + "Z": 422.4154 + }, + "TerritoryId": 146, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Southern Thanalan - Forgotten Springs", + "NextQuestId": 1021 + } + ] + } + ] +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json index 22b566e0f..e8ceb18b0 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1791_Feat of Clay.json @@ -13,7 +13,8 @@ "Z": -135.91211 }, "TerritoryId": 398, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "Fly": true } ] }, @@ -27,12 +28,16 @@ "Y": -99.931335, "Z": 644.4646 }, + "StopDistance": 0.5, "TerritoryId": 398, "InteractionType": "Interact", "CompletionQuestVariablesFlags": [ - null, null, - null, null, - null, 128 + null, + null, + null, + null, + null, + 128 ], "Fly": true }, @@ -43,13 +48,18 @@ "Y": -94.10242, "Z": 597.9553 }, + "StopDistance": 0.5, "TerritoryId": 398, "InteractionType": "Interact", "CompletionQuestVariablesFlags": [ - null, null, - null, null, - null, 64 - ] + null, + null, + null, + null, + null, + 64 + ], + "Fly": true } ] }, @@ -65,9 +75,10 @@ }, "TerritoryId": 398, "InteractionType": "CompleteQuest", - "Fly": true + "Fly": true, + "NextQuestId": 1793 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json index 7f58bbe58..4a20e28b7 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Forelands/1793_Yellow Stones.json @@ -13,7 +13,8 @@ "Z": -135.91211 }, "TerritoryId": 398, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "Fly": true } ] }, @@ -55,8 +56,8 @@ null, null, 32 - ] - + ], + "Fly": true }, { "DataId": 2005633, @@ -74,7 +75,8 @@ null, null, 128 - ] + ], + "Fly": true }, { "DataId": 2005634, @@ -92,7 +94,8 @@ null, null, 64 - ] + ], + "Fly": true } ] },{ @@ -112,4 +115,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json index b00954c43..c9275d045 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Dravanian Hinterlands/1947_A Bum Rap.json @@ -14,7 +14,8 @@ "Z": -186.4195 }, "TerritoryId": 399, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "Fly": true } ] }, @@ -59,4 +60,4 @@ } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Unlocks/Misc/3142_Secret of the Ooze.json b/QuestPaths/4.x - Stormblood/Unlocks/Dungeons/3142_Secret of the Ooze.json similarity index 95% rename from QuestPaths/4.x - Stormblood/Unlocks/Misc/3142_Secret of the Ooze.json rename to QuestPaths/4.x - Stormblood/Unlocks/Dungeons/3142_Secret of the Ooze.json index b57c78525..4920cf5d1 100644 --- a/QuestPaths/4.x - Stormblood/Unlocks/Misc/3142_Secret of the Ooze.json +++ b/QuestPaths/4.x - Stormblood/Unlocks/Dungeons/3142_Secret of the Ooze.json @@ -61,8 +61,7 @@ { "TerritoryId": 399, "InteractionType": "Duty", - "AutoDutyEnabled": true, - "ContentFinderConditionId": 62 + "ContentFinderConditionId": 584 } ] }, @@ -82,4 +81,4 @@ ] } ] -} \ No newline at end of file +} From da425f551ed7b1e26eb90ac1e95290a8e66cc9a3 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 02:26:18 +0100 Subject: [PATCH 067/109] Use gray icons for item rewards if no quest path is available --- .../JournalComponents/QuestRewardComponent.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Questionable/Windows/JournalComponents/QuestRewardComponent.cs b/Questionable/Windows/JournalComponents/QuestRewardComponent.cs index cbb3af7d8..9efa50297 100644 --- a/Questionable/Windows/JournalComponents/QuestRewardComponent.cs +++ b/Questionable/Windows/JournalComponents/QuestRewardComponent.cs @@ -1,8 +1,11 @@ using System; using System.Linq; using Dalamud.Game.Text; +using Dalamud.Interface; +using Dalamud.Interface.Colors; using Dalamud.Interface.Utility.Raii; using ImGuiNET; +using Questionable.Controller; using Questionable.Data; using Questionable.Model; using Questionable.Windows.QuestComponents; @@ -11,6 +14,7 @@ namespace Questionable.Windows.JournalComponents; internal sealed class QuestRewardComponent { + private readonly QuestRegistry _questRegistry; private readonly QuestData _questData; private readonly QuestTooltipComponent _questTooltipComponent; private readonly UiUtils _uiUtils; @@ -18,10 +22,12 @@ internal sealed class QuestRewardComponent private bool _showEventRewards; public QuestRewardComponent( + QuestRegistry questRegistry, QuestData questData, QuestTooltipComponent questTooltipComponent, UiUtils uiUtils) { + _questRegistry = questRegistry; _questData = questData; _questTooltipComponent = questTooltipComponent; _uiUtils = uiUtils; @@ -36,7 +42,8 @@ internal sealed class QuestRewardComponent ImGui.Checkbox("Show rewards from seasonal event quests", ref _showEventRewards); ImGui.Spacing(); - ImGui.BulletText("Only untradeable items are listed (e.g. the Wind-up Airship can be sold on the market board)."); + ImGui.BulletText( + "Only untradeable items are listed (e.g. the Wind-up Airship can be sold on the market board)."); DrawGroup("Mounts", EItemRewardType.Mount); DrawGroup("Minions", EItemRewardType.Minion); @@ -63,7 +70,14 @@ internal sealed class QuestRewardComponent if (isEventQuest) name += $" {SeIconChar.Clock.ToIconString()}"; - if (_uiUtils.ChecklistItem(name, item.IsUnlocked())) + bool complete = item.IsUnlocked(); + var color = !_questRegistry.IsKnownQuest(item.ElementId) + ? ImGuiColors.DalamudGrey + : complete + ? ImGuiColors.ParsedGreen + : ImGuiColors.DalamudRed; + var icon = complete ? FontAwesomeIcon.Check : FontAwesomeIcon.Times; + if (_uiUtils.ChecklistItem(name, color, icon)) { using var tooltip = ImRaii.Tooltip(); if (!tooltip) From dbc31f429fe45398e55a69cbd55d64738a530195 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 02:26:36 +0100 Subject: [PATCH 068/109] Version bump --- Directory.Build.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index 3ceabdbaf..c81f1e908 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 4.11 + 4.12 From e73d04ce2d1a253c1b422203664cb3516f403d68 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 11:18:45 +0100 Subject: [PATCH 069/109] Add a minimum delay to redeeming item rewards --- .../Controller/Steps/Shared/RedeemRewardItems.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs index 4d11e72bb..e03d989da 100644 --- a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs +++ b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs @@ -49,6 +49,7 @@ internal static class RedeemRewardItems GameFunctions gameFunctions, ICondition condition) : TaskExecutor { + private static readonly TimeSpan MinimumCastTime = TimeSpan.FromSeconds(4); private DateTime _continueAt; protected override bool Start() @@ -56,7 +57,13 @@ internal static class RedeemRewardItems if (condition[ConditionFlag.Mounted]) return false; - _continueAt = DateTime.Now.Add(Task.ItemReward.CastTime).AddSeconds(1); + TimeSpan castTime = Task.ItemReward.CastTime; + if (castTime < MinimumCastTime) + castTime = MinimumCastTime; + + _continueAt = DateTime.Now + .Add(castTime) + .AddSeconds(1); return gameFunctions.UseItem(Task.ItemReward.ItemId); } From be3f22230b35eec2d87d5c0ee61cc0947995cfa5 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 11:19:04 +0100 Subject: [PATCH 070/109] Code clean up --- .../CombatModules/RotationSolverRebornModule.cs | 8 ++++---- .../JournalComponents/AlliedSocietyJournalComponent.cs | 3 --- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs b/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs index f89ad334d..422ae7c9d 100644 --- a/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs +++ b/Questionable/Controller/CombatModules/RotationSolverRebornModule.cs @@ -14,16 +14,16 @@ namespace Questionable.Controller.CombatModules; internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable { private readonly ILogger _logger; - private readonly IClientState _clientState; private readonly Configuration _configuration; private readonly ICallGateSubscriber _test; private readonly ICallGateSubscriber _changeOperationMode; - public RotationSolverRebornModule(ILogger logger, MovementController movementController, - IClientState clientState, IDalamudPluginInterface pluginInterface, Configuration configuration) + public RotationSolverRebornModule( + ILogger logger, + IDalamudPluginInterface pluginInterface, + Configuration configuration) { _logger = logger; - _clientState = clientState; _configuration = configuration; _test = pluginInterface.GetIpcSubscriber("RotationSolverReborn.Test"); _changeOperationMode = diff --git a/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs b/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs index a5ae13b3e..c4886f588 100644 --- a/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs +++ b/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs @@ -17,7 +17,6 @@ internal sealed class AlliedSocietyJournalComponent private static readonly string[] RankNames = ["Neutral", "Recognized", "Friendly", "Trusted", "Respected", "Honored", "Sworn", "Allied"]; - private readonly QuestFunctions _questFunctions; private readonly AlliedSocietyQuestFunctions _alliedSocietyQuestFunctions; private readonly QuestData _questData; private readonly QuestRegistry _questRegistry; @@ -26,7 +25,6 @@ internal sealed class AlliedSocietyJournalComponent private readonly UiUtils _uiUtils; public AlliedSocietyJournalComponent( - QuestFunctions questFunctions, AlliedSocietyQuestFunctions alliedSocietyQuestFunctions, QuestData questData, QuestRegistry questRegistry, @@ -34,7 +32,6 @@ internal sealed class AlliedSocietyJournalComponent QuestTooltipComponent questTooltipComponent, UiUtils uiUtils) { - _questFunctions = questFunctions; _alliedSocietyQuestFunctions = alliedSocietyQuestFunctions; _questData = questData; _questRegistry = questRegistry; From c03afdefe71252a60a52bc54bad30ff669663a02 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 11:30:51 +0100 Subject: [PATCH 071/109] Code clean up --- Directory.Build.targets | 2 +- .../JournalComponents/AlliedSocietyJournalComponent.cs | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index c81f1e908..9c7a8c24a 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 4.12 + 4.13 diff --git a/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs b/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs index c4886f588..99582c24f 100644 --- a/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs +++ b/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs @@ -17,6 +17,9 @@ internal sealed class AlliedSocietyJournalComponent private static readonly string[] RankNames = ["Neutral", "Recognized", "Friendly", "Trusted", "Respected", "Honored", "Sworn", "Allied"]; +#if DEBUG + private readonly QuestFunctions _questFunctions; +#endif private readonly AlliedSocietyQuestFunctions _alliedSocietyQuestFunctions; private readonly QuestData _questData; private readonly QuestRegistry _questRegistry; @@ -25,6 +28,9 @@ internal sealed class AlliedSocietyJournalComponent private readonly UiUtils _uiUtils; public AlliedSocietyJournalComponent( +#if DEBUG + QuestFunctions questFunctions, +#endif AlliedSocietyQuestFunctions alliedSocietyQuestFunctions, QuestData questData, QuestRegistry questRegistry, @@ -32,6 +38,9 @@ internal sealed class AlliedSocietyJournalComponent QuestTooltipComponent questTooltipComponent, UiUtils uiUtils) { +#if DEBUG + _questFunctions = questFunctions; +#endif _alliedSocietyQuestFunctions = alliedSocietyQuestFunctions; _questData = questData; _questRegistry = questRegistry; From 715ec340e0b1c539dc69c73e4d1eec390196de77 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 11:32:14 +0100 Subject: [PATCH 072/109] Add a minimum delay to redeeming item rewards --- Questionable/Controller/Steps/Shared/RedeemRewardItems.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs index e03d989da..408b92f7e 100644 --- a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs +++ b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs @@ -63,7 +63,7 @@ internal static class RedeemRewardItems _continueAt = DateTime.Now .Add(castTime) - .AddSeconds(1); + .AddSeconds(3); return gameFunctions.UseItem(Task.ItemReward.ItemId); } From 35649e8663f44b0ef1d50f6aac11c64c53e6ece0 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Jan 2025 19:32:47 +0100 Subject: [PATCH 073/109] Add a slight delay in 'The Queen's Tour' for a waypoint where NPCs move weirdly --- .../4934_The Queen's Tour.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4934_The Queen's Tour.json b/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4934_The Queen's Tour.json index 313eaf38c..18f9d1e99 100644 --- a/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4934_The Queen's Tour.json +++ b/QuestPaths/7.x - Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4934_The Queen's Tour.json @@ -88,6 +88,15 @@ "InteractionType": "AttuneAethernetShard", "AethernetShard": "[Solution Nine] Nexus Arcade" }, + { + "Position": { + "X": -320.34818, + "Y": 9.519508, + "Z": -6.9244547 + }, + "TerritoryId": 1186, + "InteractionType": "WalkTo" + }, { "DataId": 1048065, "Position": { @@ -97,7 +106,8 @@ }, "StopDistance": 0.25, "TerritoryId": 1186, - "InteractionType": "Interact" + "InteractionType": "Interact", + "DelaySecondsAtStart": 3 } ] }, From ee1d6ce15b44335b490506b0b14076c3be534e54 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 4 Jan 2025 15:13:08 +0100 Subject: [PATCH 074/109] Fix Slug Shot action id + use adjusted action ids for actually executing actions --- Questionable.Model/Questing/EAction.cs | 2 +- Questionable/Functions/GameFunctions.cs | 38 ++++++++++++++----------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Questionable.Model/Questing/EAction.cs b/Questionable.Model/Questing/EAction.cs index 159c2f7e9..b8b97f32f 100644 --- a/Questionable.Model/Questing/EAction.cs +++ b/Questionable.Model/Questing/EAction.cs @@ -48,7 +48,7 @@ public enum EAction Katon = 2266, Raiton = 2267, RabbitMedium = 2272, - SlugShot = 7412, + SlugShot = 2868, BosomBrook = 37173, Souleater = 3632, Fire3 = 152, diff --git a/Questionable/Functions/GameFunctions.cs b/Questionable/Functions/GameFunctions.cs index c20f3d487..09a9be25c 100644 --- a/Questionable/Functions/GameFunctions.cs +++ b/Questionable/Functions/GameFunctions.cs @@ -206,10 +206,12 @@ internal sealed unsafe class GameFunctions public bool UseAction(EAction action) { - if (ActionManager.Instance()->GetActionStatus(ActionType.Action, (uint)action) == 0) + uint actionId = ActionManager.Instance()->GetAdjustedActionId((uint)action); + if (ActionManager.Instance()->GetActionStatus(ActionType.Action, actionId) == 0) { - bool result = ActionManager.Instance()->UseAction(ActionType.Action, (uint)action); - _logger.LogInformation("UseAction {Action} result: {Result}", action, result); + bool result = ActionManager.Instance()->UseAction(ActionType.Action, actionId); + _logger.LogInformation("UseAction {Action} (adjusted: {AdjustedActionId}) result: {Result}", action, + actionId, result); return result; } @@ -219,31 +221,34 @@ internal sealed unsafe class GameFunctions public bool UseAction(IGameObject gameObject, EAction action, bool checkCanUse = true) { - var actionRow = _dataManager.GetExcelSheet().GetRow((uint)action); - if (checkCanUse && !ActionManager.CanUseActionOnTarget((uint)action, (GameObject*)gameObject.Address)) + uint actionId = ActionManager.Instance()->GetAdjustedActionId((uint)action); + var actionRow = _dataManager.GetExcelSheet().GetRow(actionId); + if (checkCanUse && !ActionManager.CanUseActionOnTarget(actionId, (GameObject*)gameObject.Address)) { - _logger.LogWarning("Can not use action {Action} on target {Target}", action, gameObject); + _logger.LogWarning("Can not use action {Action} (adjusted: {AdjustedActionId}) on target {Target}", action, + actionId, gameObject); return false; } _targetManager.Target = gameObject; - if (ActionManager.Instance()->GetActionStatus(ActionType.Action, (uint)action, gameObject.GameObjectId) == 0) + if (ActionManager.Instance()->GetActionStatus(ActionType.Action, actionId, gameObject.GameObjectId) == 0) { bool result; if (actionRow.TargetArea) { Vector3 position = gameObject.Position; - result = ActionManager.Instance()->UseActionLocation(ActionType.Action, (uint)action, + result = ActionManager.Instance()->UseActionLocation(ActionType.Action, actionId, location: &position); - _logger.LogInformation("UseAction {Action} on target area {Target} result: {Result}", action, - gameObject, - result); + _logger.LogInformation( + "UseAction {Action} (adjusted: {AdjustedActionId}) on target area {Target} result: {Result}", + action, actionId, gameObject, result); } else { - result = ActionManager.Instance()->UseAction(ActionType.Action, (uint)action, gameObject.GameObjectId); - _logger.LogInformation("UseAction {Action} on target {Target} result: {Result}", action, gameObject, - result); + result = ActionManager.Instance()->UseAction(ActionType.Action, actionId, gameObject.GameObjectId); + _logger.LogInformation( + "UseAction {Action} (adjusted: {AdjustedActionId}) on target {Target} result: {Result}", action, + actionId, gameObject, result); } return result; @@ -307,7 +312,7 @@ internal sealed unsafe class GameFunctions StatusManager* statusManager = battleChara->GetStatusManager(); return statusManager->HasStatus((uint)statusId); } - + public static bool RemoveStatus(EStatus statusId) { return StatusManager.ExecuteStatusOff((uint)statusId); @@ -452,7 +457,8 @@ internal sealed unsafe class GameFunctions public bool IsLoadingScreenVisible() { - if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) && LAddon.IsAddonReady(fade) && fade->IsVisible) + if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) && LAddon.IsAddonReady(fade) && + fade->IsVisible) return true; if (_gameGui.TryGetAddonByName("FadeBack", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible) From 25130dcb7c8c38889c1d9218bae044b1b54f18aa Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 4 Jan 2025 16:10:01 +0100 Subject: [PATCH 075/109] Add some Moogle quests --- .../Dailies/2290_With a Little Help.json | 136 ++++++++++++-- .../2304_Back to the Drawing Board.json | 54 +++++- .../Moogles/Dailies/2305_Built to Last.json | 172 +++++++++++++++++- .../Dailies/2306_Let There Be Light.json | 67 ++++++- Questionable/Data/AlliedSocietyData.cs | 2 +- 5 files changed, 411 insertions(+), 20 deletions(-) diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2290_With a Little Help.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2290_With a Little Help.json index 1a867f707..727189ae2 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2290_With a Little Help.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2290_With a Little Help.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,125 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017351, + "Position": { + "X": -74.87604, + "Y": -8.172172, + "Z": 158.70898 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15725, + "ItemCount": 3 + }, + { + "DataId": 1017352, + "Position": { + "X": -56.809387, + "Y": -8.866012, + "Z": 161.8219 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1017353, + "Position": { + "X": -33.554626, + "Y": -8.866012, + "Z": 163.43933 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "Position": { + "X": -104.788086, + "Y": -8.655561, + "Z": 194.60593 + }, + "TerritoryId": 400, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + } + }, + { + "DataId": 1017354, + "Position": { + "X": -104.41754, + "Y": -8.6555605, + "Z": 193.16394 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1017355, + "Position": { + "X": -110.97894, + "Y": -8.866015, + "Z": 247.94385 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, { "Sequence": 255, "Steps": [ @@ -30,21 +148,7 @@ }, "TerritoryId": 400, "InteractionType": "CompleteQuest", - "AetheryteShortcut": "The Churning Mists - Zenith", - "Fly": true, - "SkipConditions": { - "AetheryteShortcutIf": { - "NearPosition": { - "Position": { - "X": -335.56116, - "Y": 59.003433, - "Z": 313.98486 - }, - "TerritoryId": 400, - "MaximumDistance": 50 - } - } - } + "Fly": true } ] } diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2304_Back to the Drawing Board.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2304_Back to the Drawing Board.json index 1a867f707..9baed817c 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2304_Back to the Drawing Board.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2304_Back to the Drawing Board.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,59 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017406, + "Position": { + "X": -95.04846, + "Y": 79.8345, + "Z": -301.80823 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1017407, + "Position": { + "X": -128.34369, + "Y": 125.92322, + "Z": -314.6258 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15736, + "ItemCount": 3 + }, + { + "DataId": 1017408, + "Position": { + "X": -108.59851, + "Y": 122.442116, + "Z": -318.31848 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2305_Built to Last.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2305_Built to Last.json index 1a867f707..8ba39c756 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2305_Built to Last.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2305_Built to Last.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,177 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017471, + "Position": { + "X": -391.0735, + "Y": 59.9946, + "Z": 303.1814 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -255.2606, + "Y": -24.29513, + "Z": 737.67456 + }, + "TerritoryId": 400, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1017409, + "Position": { + "X": -254.71893, + "Y": -24.295156, + "Z": 738.5519 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007244, + "Position": { + "X": -658.9609, + "Y": 94.25488, + "Z": -417.07483 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "AetheryteShortcut": "The Churning Mists - Zenith", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "Position": { + "X": -673.58887, + "Y": 93.64293, + "Z": -506.5746 + }, + "TerritoryId": 400, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + } + }, + { + "DataId": 2007245, + "Position": { + "X": -671.1376, + "Y": 93.91919, + "Z": -507.49982 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2007246, + "Position": { + "X": -813.1685, + "Y": 94.865234, + "Z": -457.3282 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -255.2606, + "Y": -24.29513, + "Z": 737.67456 + }, + "TerritoryId": 400, + "InteractionType": "WalkTo", + "AetheryteShortcut": "The Churning Mists - Zenith", + "Fly": true + }, + { + "DataId": 1017409, + "Position": { + "X": -254.71893, + "Y": -24.295156, + "Z": 738.5519 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "TerritoryId": 400, + "InteractionType": "Craft", + "ItemId": 15737, + "ItemCount": 1 + }, + { + "DataId": 1017410, + "Position": { + "X": -246.2044, + "Y": -24.295149, + "Z": 760.7384 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2306_Let There Be Light.json b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2306_Let There Be Light.json index 1a867f707..9b09643b5 100644 --- a/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2306_Let There Be Light.json +++ b/QuestPaths/3.x - Heavensward/Allied Societies/Moogles/Dailies/2306_Let There Be Light.json @@ -1,7 +1,6 @@ { "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -18,6 +17,72 @@ } ] }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1017470, + "Position": { + "X": -353.53632, + "Y": 60.896175, + "Z": 299.61084 + }, + "TerritoryId": 400, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2007264, + "Position": { + "X": 508.32373, + "Y": -0.77819824, + "Z": -360.49445 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2007265, + "Position": { + "X": 613.39734, + "Y": -11.917358, + "Z": -335.6222 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2007266, + "Position": { + "X": 554.0398, + "Y": 50.644653, + "Z": -393.72858 + }, + "TerritoryId": 400, + "InteractionType": "Action", + "Action": "Roar", + "Fly": true + } + ] + }, { "Sequence": 255, "Steps": [ diff --git a/Questionable/Data/AlliedSocietyData.cs b/Questionable/Data/AlliedSocietyData.cs index 11ea03a12..d76003d83 100644 --- a/Questionable/Data/AlliedSocietyData.cs +++ b/Questionable/Data/AlliedSocietyData.cs @@ -53,7 +53,7 @@ internal sealed class AlliedSocietyData else if (alliedSociety == EAlliedSociety.Moogles) { normalNpcs = []; - mountNpcs = [1017322, 1017470]; + mountNpcs = [1017322, 1017470, 1017471]; } else { From 459b832ef2ce21b615ab368a8366f34adae43b5e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 4 Jan 2025 16:48:13 +0100 Subject: [PATCH 076/109] Update logic for which allied society quests can be accepted --- Questionable/Functions/QuestFunctions.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index 2078ca9e0..f0e6d1591 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -450,14 +450,19 @@ internal sealed unsafe class QuestFunctions if (IsQuestAccepted(questId)) return false; - if (quest.Info.AlliedSociety != EAlliedSociety.None) + if (questId is QuestId qId && IsDailyAlliedSocietyQuest(qId)) { if (QuestManager.Instance()->IsDailyQuestCompleted(questId.Value)) return false; - } - if (IsQuestComplete(questId)) - return false; + if (!IsDailyAlliedSocietyQuestAndAvailableToday(qId)) + return false; + } + else + { + if (IsQuestComplete(questId)) + return false; + } } else { From 2503d1897fee61536a7ad1d23b25d586329c90dd Mon Sep 17 00:00:00 2001 From: Gwen Date: Sat, 4 Jan 2025 17:22:24 +0100 Subject: [PATCH 077/109] New set of sidequests for Triple Triad NPCs --- .../1762_The Secret to Success.json | 125 ++++++++++ .../1764_Introductory Dragonslaying.json | 98 ++++++++ .../1765_Intermediate Dragonslaying.json | 97 ++++++++ .../1766_Advanced Dragonslaying.json | 103 ++++++++ .../1769_Expert Dragonslaying.json | 185 ++++++++++++++ .../1889_Unknown Ultimatum.json | 121 +++++++++ .../1890_Personal Effects.json | 75 ++++++ .../1891_Ayleth Absconds.json | 98 ++++++++ .../1892_A Missing Tooth.json | 83 +++++++ .../1893_A Noble Purpose.json | 112 +++++++++ .../1898_A War without End.json | 229 ++++++++++++++++++ .../1730_Cold Days, Colder Nights.json | 140 +++++++++++ .../Ishgard/1870_Caught in the Act.json | 149 ++++++++++++ .../Side Quests/Ishgard/1873_Enlisted.json | 53 ++++ .../1840_A Secret from Everyone.json | 134 ++++++++++ 15 files changed, 1802 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1764_Introductory Dragonslaying.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1769_Expert Dragonslaying.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1889_Unknown Ultimatum.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1891_Ayleth Absconds.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1898_A War without End.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1730_Cold Days, Colder Nights.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1870_Caught in the Act.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/The Churning Mists/1840_A Secret from Everyone.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json new file mode 100644 index 000000000..1c16e3f1b --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json @@ -0,0 +1,125 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014133, + "Position": { + "X": -259.84595, + "Y": 126.44779, + "Z": 1.9073486 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2006005, + "Position": { + "X": -157.70203, + "Y": 110.73462, + "Z": -52.414795 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2006006, + "Position": { + "X": -228.25977, + "Y": 112.47424, + "Z": -127.55017 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2006007, + "Position": { + "X": -348.10413, + "Y": 116.50256, + "Z": -91.93567 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014133, + "Position": { + "X": -259.84595, + "Y": 126.44779, + "Z": 1.9073486 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1764_Introductory Dragonslaying.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1764_Introductory Dragonslaying.json new file mode 100644 index 000000000..c526f6737 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1764_Introductory Dragonslaying.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014134, + "Position": { + "X": -293.23267, + "Y": 126.85495, + "Z": 5.2643433 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Fly": true, + "DataId": 1014136, + "Position": { + "X": 292.74426, + "Y": 132.44626, + "Z": -244.73944 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + }, + { + "Position": { + "X": 289.0053, + "Y": 132.30807, + "Z": -233.57523 + }, + "DataId": 4041, + "TerritoryId": 397, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 4041 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014136, + "Position": { + "X": 292.74426, + "Y": 132.44626, + "Z": -244.73944 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "NextQuestId": 1765 + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json new file mode 100644 index 000000000..ae7e2afef --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json @@ -0,0 +1,97 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014138, + "Position": { + "X": -219.19586, + "Y": 112.21238, + "Z": -244.1596 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Fly": true, + "DataId": 4470, + "Position": { + "X": -468.44992, + "Y": 93.85853, + "Z": -506.40417 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 4470 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -219.1624, + "Y": 112.29031, + "Z": -239.88861 + }, + "TerritoryId": 397, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1014138, + "Position": { + "X": -219.19586, + "Y": 112.21238, + "Z": -244.1596 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "NextQuestId": 1766 + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json new file mode 100644 index 000000000..4f9d54e23 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json @@ -0,0 +1,103 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014138, + "Position": { + "X": -219.19586, + "Y": 112.21238, + "Z": -244.1596 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Fly": true, + "DataId": 1014140, + "Position": { + "X": -472.19043, + "Y": 93.87282, + "Z": -503.7156 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 4468, + "Position": { + "X": -696.8278, + "Y": 100.08534, + "Z": -603.926 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "KillEnemyDataIds": [ + 4468 + ], + "EnemySpawnType": "AutoOnEnterArea" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1014140, + "Position": { + "X": -472.19043, + "Y": 93.87282, + "Z": -503.7156 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "NextQuestId": 1769 + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1769_Expert Dragonslaying.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1769_Expert Dragonslaying.json new file mode 100644 index 000000000..41a0e1d5c --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1769_Expert Dragonslaying.json @@ -0,0 +1,185 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Fly": true, + "DataId": 1014142, + "Position": { + "X": -290.33344, + "Y": 76.98337, + "Z": -259.93744 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2006013, + "Position": { + "X": -287.76996, + "Y": 77.74463, + "Z": -278.00415 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014142, + "Position": { + "X": -290.33344, + "Y": 76.98337, + "Z": -259.93744 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2006014, + "Position": { + "X": -291.8593, + "Y": 76.98169, + "Z": -261.0056 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + }, + { + "DataId": 4037, + "Position": { + "X": -285.1214, + "Y": 76.98337, + "Z": -275.5287 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "KillEnemyDataIds": [4037], + "EnemySpawnType": "AfterInteraction" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1014142, + "Position": { + "X": -290.33344, + "Y": 76.98337, + "Z": -259.93744 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Fly": true, + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1014144, + "Position": { + "X": -258.16742, + "Y": 126.98671, + "Z": 12.77179 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 2006015, + "Position": { + "X": -252.33844, + "Y": 127.00073, + "Z": 11.093262 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1014144, + "Position": { + "X": -258.16742, + "Y": 126.98671, + "Z": 12.77179 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1889_Unknown Ultimatum.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1889_Unknown Ultimatum.json new file mode 100644 index 000000000..2072032e2 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1889_Unknown Ultimatum.json @@ -0,0 +1,121 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014147, + "Position": { + "X": -256.97723, + "Y": 126.99508, + "Z": 13.168518 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Fly": true, + "Position": { + "X": -298.8484, + "Y": 221.68138, + "Z": 548.0529 + }, + "TerritoryId": 397, + "InteractionType": "WalkTo" + }, + { + "Land": true, + "DataId": 1014149, + "Position": { + "X": -294.5144, + "Y": 221.58685, + "Z": 545.922 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2006017, + "Position": { + "X": -253.34558, + "Y": 221.36255, + "Z": 528.92346 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + }, + { + "DataId": 4076, + "Position": { + "X": -257.5558, + "Y": 221.35532, + "Z": 520.9053 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "KillEnemyDataIds": [4076], + "EnemySpawnType": "AfterInteraction" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1014149, + "Position": { + "X": -294.5144, + "Y": 221.58685, + "Z": 545.922 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "NextQuestId": 1890 + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json new file mode 100644 index 000000000..bddb06053 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -297.49585, + "Y": 219.87524, + "Z": 281.65045 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 3992, + "MinimumKillCount": 5 + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Fly": true, + "DataId": 1014150, + "Position": { + "X": 507.13354, + "Y": 217.95148, + "Z": 791.37854 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "NextQuestId": 1891 + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1891_Ayleth Absconds.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1891_Ayleth Absconds.json new file mode 100644 index 000000000..03490c145 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1891_Ayleth Absconds.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Fly": true, + "DataId": 1014151, + "Position": { + "X": -156.08453, + "Y": 219.14235, + "Z": 669.7031 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + }, + { + "DataId": 732, + "Position": { + "X": -151.29321, + "Y": 218.95082, + "Z": 669.4895 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 732 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1014151, + "Position": { + "X": -156.08453, + "Y": 219.14235, + "Z": 669.7031 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014151, + "Position": { + "X": -156.08453, + "Y": 219.14235, + "Z": 669.7031 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "NextQuestId": 1892 + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json new file mode 100644 index 000000000..657fd96f8 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json @@ -0,0 +1,83 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Fly": true, + "DataId": 2006019, + "Position": { + "X": -152.42242, + "Y": 219.62305, + "Z": 669.94727 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + }, + { + "DataId": 4782, + "Position": { + "X": -158.97404, + "Y": 219.45131, + "Z": 672.79553 + }, + "TerritoryId": 397, + "KillEnemyDataIds": [ + 4782 + ], + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2006181, + "Position": { + "X": -152.42242, + "Y": 219.62305, + "Z": 669.94727 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "NextQuestId": 1983 + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json new file mode 100644 index 000000000..7a5a5c64e --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014146, + "Position": { + "X": -258.74725, + "Y": 126.98546, + "Z": 12.649658 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1011907, + "Position": { + "X": -288.8686, + "Y": 127.06639, + "Z": 13.199036 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1011910, + "Position": { + "X": -298.26813, + "Y": 126.67049, + "Z": -1.4191895 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1014133, + "Position": { + "X": -259.84595, + "Y": 126.44779, + "Z": 1.9073486 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Fly": true, + "DataId": 1014152, + "Position": { + "X": 496.1776, + "Y": 133.93082, + "Z": -862.2416 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1014153, + "Position": { + "X": -295.82666, + "Y": 126.83744, + "Z": 3.829956 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1898_A War without End.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1898_A War without End.json new file mode 100644 index 000000000..fb9687275 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1898_A War without End.json @@ -0,0 +1,229 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1014153, + "Position": { + "X": -295.82666, + "Y": 126.83744, + "Z": 3.829956 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Fly": true, + "DataId": 1014154, + "Position": { + "X": -519.1577, + "Y": 119.39417, + "Z": -161.24213 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1014155, + "Position": { + "X": -527.245, + "Y": 118.94699, + "Z": -163.13422 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2006026, + "Position": { + "X": -525.7191, + "Y": 119.06604, + "Z": -165.72827 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Fly": true, + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "Fly": true, + "Position": { + "X": -92.57648, + "Y": 96.33008, + "Z": -645.1057 + }, + "TerritoryId": 397, + "InteractionType": "WalkTo" + }, + { + "DataId": 2006027, + "Position": { + "X": -92.57648, + "Y": 96.33008, + "Z": -645.1057 + }, + "TerritoryId": 397, + "InteractionType": "UseItem", + "ItemId": 2001751 + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 2006028, + "Position": { + "X": -92.5155, + "Y": 93.52246, + "Z": -623.621 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + }, + { + "DataId": 4621, + "Position": { + "X": -92.37683, + "Y": 95.76039, + "Z": -640.7043 + }, + "TerritoryId": 397, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 4621 + ] + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 2006460, + "Position": { + "X": -92.57648, + "Y": 96.33008, + "Z": -645.1057 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 10, + "Steps": [ + { + "Fly": true, + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 11, + "Steps": [ + { + "DataId": 1014147, + "Position": { + "X": -256.97723, + "Y": 126.99508, + "Z": 13.168518 + }, + "TerritoryId": 397, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1013710, + "Position": { + "X": -294.6975, + "Y": 126.84874, + "Z": 4.5318604 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1730_Cold Days, Colder Nights.json b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1730_Cold Days, Colder Nights.json new file mode 100644 index 000000000..0be23e3f5 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1730_Cold Days, Colder Nights.json @@ -0,0 +1,140 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012170, + "Position": { + "X": 102.92212, + "Y": 3.6299734, + "Z": 65.56799 + }, + "TerritoryId": 418, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1012162, + "Position": { + "X": 135.97314, + "Y": 24.376427, + "Z": 12.619202 + }, + "TerritoryId": 418, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1012170, + "Position": { + "X": 102.92212, + "Y": 3.6299734, + "Z": 65.56799 + }, + "TerritoryId": 418, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014711, + "Position": { + "X": 58.03003, + "Y": -7.146736, + "Z": 82.41394 + }, + "TerritoryId": 418, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1014712, + "Position": { + "X": 93.91919, + "Y": -19.941168, + "Z": 78.20239 + }, + "TerritoryId": 418, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1014713, + "Position": { + "X": 131.9447, + "Y": -20.000105, + "Z": 62.027832 + }, + "TerritoryId": 418, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1014714, + "Position": { + "X": 23.178406, + "Y": -12.020877, + "Z": 35.294067 + }, + "TerritoryId": 418, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012170, + "Position": { + "X": 102.92212, + "Y": 3.6299734, + "Z": 65.56799 + }, + "TerritoryId": 418, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1870_Caught in the Act.json b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1870_Caught in the Act.json new file mode 100644 index 000000000..2016dfb6d --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1870_Caught in the Act.json @@ -0,0 +1,149 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012180, + "Position": { + "X": -174.18176, + "Y": -12.555469, + "Z": -21.561035 + }, + "TerritoryId": 419, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2006246, + "Position": { + "X": -218.40247, + "Y": -16.037292, + "Z": -34.683777 + }, + "TerritoryId": 419, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2006247, + "Position": { + "X": -229.23633, + "Y": -20.035156, + "Z": -83.05487 + }, + "TerritoryId": 419, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2006248, + "Position": { + "X": -252.1554, + "Y": -20.035156, + "Z": -57.66388 + }, + "TerritoryId": 419, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1012180, + "Position": { + "X": -174.18176, + "Y": -12.555469, + "Z": -21.561035 + }, + "TerritoryId": 419, + "InteractionType": "Interact" + } + ] + + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1014721, + "Position": { + "X": 119.31018, + "Y": -12.634913, + "Z": -13.626343 + }, + "TerritoryId": 419, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Ishgard] The Jeweled Crozier", + "[Ishgard] Athenaeum Astrologicum" + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2006330, + "Position": { + "X": 118.791504, + "Y": -11.6427, + "Z": -13.351685 + }, + "TerritoryId": 419, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012180, + "Position": { + "X": -174.18176, + "Y": -12.555469, + "Z": -21.561035 + }, + "TerritoryId": 419, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Ishgard] Athenaeum Astrologicum", + "[Ishgard] The Jeweled Crozier" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json new file mode 100644 index 000000000..ef0a9cbde --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1014718, + "Position": { + "X": -29.526245, + "Y": 11.965078, + "Z": 48.355713 + }, + "TerritoryId": 419, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1011231, + "Position": { + "X": 503.1051, + "Y": 217.95148, + "Z": 790.2189 + }, + "TerritoryId": 397, + "InteractionType": "Interact", + "AetheryteShortcut": "Coerthas Western Highlands - Falcon's Nest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1014719, + "Position": { + "X": -293.6294, + "Y": 125.4389, + "Z": -19.058533 + }, + "TerritoryId": 397, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/3.x - Heavensward/Side Quests/The Churning Mists/1840_A Secret from Everyone.json b/QuestPaths/3.x - Heavensward/Side Quests/The Churning Mists/1840_A Secret from Everyone.json new file mode 100644 index 000000000..e53516035 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/The Churning Mists/1840_A Secret from Everyone.json @@ -0,0 +1,134 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Thaksin", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012085, + "Position": { + "X": 286.88477, + "Y": 14.36517, + "Z": 645.1666 + }, + "TerritoryId": 400, + "InteractionType": "AcceptQuest" + } + ] + }, + + { + "Sequence": 1, + "Steps": [ + { + "Fly": true, + "DataId": 2005720, + "Position": { + "X": 565.9419, + "Y": -9.445435, + "Z": -14.328308 + }, + "TerritoryId": 400, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ], + "InteractionType": "Interact" + }, + { + "DataId": 2005718, + "Position": { + "X": 664.39294, + "Y": -0.4730835, + "Z": -3.2807007 + }, + "Fly": true, + "TerritoryId": 400, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2005721, + "Position": { + "X": 653.83374, + "Y": -0.7172241, + "Z": -70.02368 + }, + "TerritoryId": 400, + "Fly": true, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, null, + null, null, + null, 8 + ] + }, + { + "DataId": 2005717, + "Position": { + "X": 639.00195, + "Y": 46.463623, + "Z": -113.05414 + }, + "TerritoryId": 400, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2005719, + "Position": { + "X": 527.0923, + "Y": -4.287842, + "Z": -84.916504 + }, + "Fly": true, + "TerritoryId": 400, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Fly": true, + "DataId": 1012085, + "Position": { + "X": 286.88477, + "Y": 14.36517, + "Z": 645.1666 + }, + "TerritoryId": 400, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} \ No newline at end of file From 563a11d47d14fcb47d63ec21ed57b2f1af14cb50 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 5 Jan 2025 14:23:38 +0100 Subject: [PATCH 078/109] Override journal genre for some Radz-at-Han/Thavnair side quests --- Questionable/Data/QuestData.cs | 8 +++++++- Questionable/Model/JournalGenreOverrides.cs | 7 +++++++ Questionable/Model/QuestInfo.cs | 9 +++++++-- 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 Questionable/Model/JournalGenreOverrides.cs diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index 7a3229a76..652258633 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -40,6 +40,12 @@ internal sealed class QuestData public QuestData(IDataManager dataManager) { + JournalGenreOverrides journalGenreOverrides = new() + { + RadzAtHanSideQuests = dataManager.GetExcelSheet().GetRow(69805).JournalGenre.RowId, + ThavnairSideQuests = dataManager.GetExcelSheet().GetRow(70025).JournalGenre.RowId, + }; + Dictionary questChapters = dataManager.GetExcelSheet() .Where(x => x.RowId > 0 && x.Quest.RowId > 0) @@ -59,7 +65,7 @@ internal sealed class QuestData .Where(x => x.RowId > 0) .Where(x => x.IssuerLocation.RowId > 0) .Select(x => new QuestInfo(x, questChapters.GetValueOrDefault(x.RowId), - startingCities.GetValueOrDefault(x.RowId))), + startingCities.GetValueOrDefault(x.RowId), journalGenreOverrides)), ..dataManager.GetExcelSheet() .Where(x => x is { RowId: > 0, Npc.RowId: > 0 }) .Select(x => new SatisfactionSupplyInfo(x)), diff --git a/Questionable/Model/JournalGenreOverrides.cs b/Questionable/Model/JournalGenreOverrides.cs new file mode 100644 index 000000000..bafd72821 --- /dev/null +++ b/Questionable/Model/JournalGenreOverrides.cs @@ -0,0 +1,7 @@ +namespace Questionable.Model; + +internal sealed class JournalGenreOverrides +{ + public required uint ThavnairSideQuests { get; init; } + public required uint RadzAtHanSideQuests { get; init; } +} diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index 06c6dc34b..751470b55 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -12,7 +12,7 @@ namespace Questionable.Model; internal sealed class QuestInfo : IQuestInfo { - public QuestInfo(ExcelQuest quest, uint newGamePlusChapter, byte startingCity) + public QuestInfo(ExcelQuest quest, uint newGamePlusChapter, byte startingCity, JournalGenreOverrides journalGenreOverrides) { QuestId = new QuestId((ushort)(quest.RowId & 0xFFFF)); @@ -53,7 +53,12 @@ internal sealed class QuestInfo : IQuestInfo .Where(x => x.Value != 0) .ToImmutableList(); QuestLockJoin = (EQuestJoin)quest.QuestLockJoin; - JournalGenre = quest.JournalGenre.ValueNullable?.RowId; + JournalGenre = QuestId.Value switch + { + >= 4196 and <= 4209 => journalGenreOverrides.ThavnairSideQuests, + 4173 => journalGenreOverrides.RadzAtHanSideQuests, + _ => quest.JournalGenre.ValueNullable?.RowId, + }; SortKey = quest.SortKey; IsMainScenarioQuest = quest.JournalGenre.ValueNullable?.JournalCategory.ValueNullable?.JournalSection .ValueNullable?.RowId is 0 or 1; From 69e05722c8c371164e9a720a08777989ec7b9500 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 5 Jan 2025 14:26:51 +0100 Subject: [PATCH 079/109] Rework `IsMainScenarioQuest` to be less reliant on actual journal ids --- Questionable/Model/QuestInfo.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index 751470b55..5f261275d 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -60,8 +60,7 @@ internal sealed class QuestInfo : IQuestInfo _ => quest.JournalGenre.ValueNullable?.RowId, }; SortKey = quest.SortKey; - IsMainScenarioQuest = quest.JournalGenre.ValueNullable?.JournalCategory.ValueNullable?.JournalSection - .ValueNullable?.RowId is 0 or 1; + IsMainScenarioQuest = quest.JournalGenre.ValueNullable?.Icon == 61412; CompletesInstantly = quest.TodoParams[0].ToDoCompleteSeq == 0; PreviousInstanceContent = quest.InstanceContent.Select(x => (ushort)x.RowId).Where(x => x != 0).ToList(); PreviousInstanceContentJoin = (EQuestJoin)quest.InstanceContentJoin; From 90f92b9aa9db626c08361d4b4779321e91da2645 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 5 Jan 2025 15:51:20 +0100 Subject: [PATCH 080/109] Add some Thavnair side quests --- .../Thavnair/4196_Fruit Savior.json | 72 +++++ .../Thavnair/4197_Shelling Out.json | 59 +++++ .../Thavnair/4199_The Great Heist.json | 74 ++++++ .../Thavnair/4200_Wish Upon a Crystal.json | 65 +++++ .../4201_High Importance, Low Urgency.json | 104 ++++++++ .../4202_Paint, Perfume, and Pecs.json | 110 ++++++++ .../Thavnair/4204_A Nose for Trouble.json | 149 +++++++++++ .../Thavnair/4205_Missing Alchemist.json | 185 +++++++++++++ .../Thavnair/4206_Hamsa Retrieval.json | 74 ++++++ .../4207_High Hopes for the Hatchery.json | 246 ++++++++++++++++++ .../Thavnair/4208_Cutting Edge Solutions.json | 98 +++++++ .../Thavnair/4209_Rushing up That Hill.json | 64 +++++ QuestPaths/quest-v1.json | 3 +- .../Questing/Converter/EmoteConverter.cs | 3 +- Questionable.Model/Questing/EEmote.cs | 1 + 15 files changed, 1305 insertions(+), 2 deletions(-) create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4196_Fruit Savior.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4197_Shelling Out.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4199_The Great Heist.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4200_Wish Upon a Crystal.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4201_High Importance, Low Urgency.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4202_Paint, Perfume, and Pecs.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4204_A Nose for Trouble.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4205_Missing Alchemist.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4206_Hamsa Retrieval.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4207_High Hopes for the Hatchery.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4208_Cutting Edge Solutions.json create mode 100644 QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4209_Rushing up That Hill.json diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4196_Fruit Savior.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4196_Fruit Savior.json new file mode 100644 index 000000000..3aefd4d16 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4196_Fruit Savior.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": 193.6185, + "Y": 1.9123514, + "Z": 713.436 + }, + "TerritoryId": 957, + "InteractionType": "WalkTo" + }, + { + "DataId": 1037622, + "Position": { + "X": 189.94562, + "Y": 0.8560083, + "Z": 702.7896 + }, + "StopDistance": 0.25, + "TerritoryId": 957, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2011979, + "Position": { + "X": 236.1333, + "Y": 10.666016, + "Z": 613.27527 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 193.6185, + "Y": 1.9123514, + "Z": 713.436 + }, + "TerritoryId": 957, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1037622, + "Position": { + "X": 189.94562, + "Y": 0.8560083, + "Z": 702.7896 + }, + "StopDistance": 0.25, + "TerritoryId": 957, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4197_Shelling Out.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4197_Shelling Out.json new file mode 100644 index 000000000..1f89df9a4 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4197_Shelling Out.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1037625, + "Position": { + "X": 176.47058, + "Y": 1.8742183, + "Z": 799.2217 + }, + "StopDistance": 1, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 13.657948, + "Y": 1.6567476, + "Z": 631.81714 + }, + "TerritoryId": 957, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [ + 13527 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1037625, + "Position": { + "X": 176.47058, + "Y": 1.8742183, + "Z": 799.2217 + }, + "StopDistance": 1, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4199_The Great Heist.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4199_The Great Heist.json new file mode 100644 index 000000000..a4707e230 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4199_The Great Heist.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1037682, + "Position": { + "X": -564.1108, + "Y": 11.802608, + "Z": 124.28467 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1039378, + "Position": { + "X": -103.25781, + "Y": 2.5712337, + "Z": 597.589 + }, + "TerritoryId": 957, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 14119, + 14120 + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2011933, + "Position": { + "X": -102.61694, + "Y": 3.0059814, + "Z": 598.9319 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1037682, + "Position": { + "X": -564.1108, + "Y": 11.802608, + "Z": 124.28467 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4200_Wish Upon a Crystal.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4200_Wish Upon a Crystal.json new file mode 100644 index 000000000..638d84bc3 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4200_Wish Upon a Crystal.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1037671, + "Position": { + "X": -554.37555, + "Y": 1.120665, + "Z": 22.690125 + }, + "StopDistance": 0.5, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1039384, + "Position": { + "X": 223.22424, + "Y": 10.211119, + "Z": 562.4321 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_AKTKZA021_04200_Q1_000_000", + "Answer": "TEXT_AKTKZA021_04200_A1_000_002" + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1037671, + "Position": { + "X": -554.37555, + "Y": 1.120665, + "Z": 22.690125 + }, + "StopDistance": 0.5, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4201_High Importance, Low Urgency.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4201_High Importance, Low Urgency.json new file mode 100644 index 000000000..4c220c664 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4201_High Importance, Low Urgency.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1039516, + "Position": { + "X": -554.89435, + "Y": 11.402609, + "Z": 125.10864 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1037680, + "Position": { + "X": -550.1946, + "Y": 1.6023201, + "Z": 50.766724 + }, + "StopDistance": 1, + "TerritoryId": 957, + "InteractionType": "Emote", + "Emote": "greeting", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1037670, + "Position": { + "X": -508.84262, + "Y": -3.7109916E-05, + "Z": -20.767578 + }, + "TerritoryId": 957, + "InteractionType": "Emote", + "Emote": "greeting", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1037676, + "Position": { + "X": -502.95264, + "Y": 12.375282, + "Z": 116.31946 + }, + "TerritoryId": 957, + "InteractionType": "Emote", + "Emote": "greeting", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1039516, + "Position": { + "X": -554.89435, + "Y": 11.402609, + "Z": 125.10864 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4202_Paint, Perfume, and Pecs.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4202_Paint, Perfume, and Pecs.json new file mode 100644 index 000000000..194e951a0 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4202_Paint, Perfume, and Pecs.json @@ -0,0 +1,110 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1039379, + "Position": { + "X": -478.3246, + "Y": 39.636753, + "Z": 95.47571 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_AKTKZA023_04202_Q1_000_000", + "Answer": "TEXT_AKTKZA023_04202_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1039380, + "Position": { + "X": -386.862, + "Y": 21.832859, + "Z": 206.77502 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1039380, + "Position": { + "X": -386.862, + "Y": 21.832859, + "Z": 206.77502 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2011911, + "Position": { + "X": -387.28925, + "Y": 21.744019, + "Z": 208.88062 + }, + "TerritoryId": 957, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 14118 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1039380, + "Position": { + "X": -386.862, + "Y": 21.832859, + "Z": 206.77502 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1039379, + "Position": { + "X": -478.3246, + "Y": 39.636753, + "Z": 95.47571 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4204_A Nose for Trouble.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4204_A Nose for Trouble.json new file mode 100644 index 000000000..0607e6d99 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4204_A Nose for Trouble.json @@ -0,0 +1,149 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1039365, + "Position": { + "X": -490.37924, + "Y": 5.667216, + "Z": 63.553833 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1039366, + "Position": { + "X": -385.24457, + "Y": 15.095761, + "Z": 62.974 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1039367, + "Position": { + "X": -161.85254, + "Y": 32.732735, + "Z": 210.74231 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2011903, + "Position": { + "X": -161.5473, + "Y": 32.211792, + "Z": 225.36047 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2011904, + "Position": { + "X": -148.57715, + "Y": 34.10388, + "Z": 207.84314 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2011902, + "Position": { + "X": -170.21442, + "Y": 31.814941, + "Z": 193.1029 + }, + "TerritoryId": 957, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 14117 + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1039367, + "Position": { + "X": -161.85254, + "Y": 32.732735, + "Z": 210.74231 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1039365, + "Position": { + "X": -490.37924, + "Y": 5.667216, + "Z": 63.553833 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4205_Missing Alchemist.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4205_Missing Alchemist.json new file mode 100644 index 000000000..6da549427 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4205_Missing Alchemist.json @@ -0,0 +1,185 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1039371, + "Position": { + "X": -409.93365, + "Y": 10.751212, + "Z": 33.035767 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1039372, + "Position": { + "X": 195.91052, + "Y": 4.763736, + "Z": 658.2893 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Yedlihmad" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1039373, + "Position": { + "X": -314.6258, + "Y": 0.70631444, + "Z": 561.12 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_AKTKZA026_04205_Q1_000_000", + "Answer": "TEXT_AKTKZA026_04205_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2011905, + "Position": { + "X": -443.04572, + "Y": -0.22894287, + "Z": 800.7781 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2011906, + "Position": { + "X": -458.42682, + "Y": -0.19836426, + "Z": 830.8689 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Mount": false, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -458.42682, + "Y": -0.19836426, + "Z": 830.8689 + }, + "StopDistance": 5, + "TerritoryId": 957, + "InteractionType": "Dive" + }, + { + "DataId": 2011908, + "Position": { + "X": -484.85547, + "Y": -72.22095, + "Z": 814.35876 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 2011907, + "Position": { + "X": -452.90308, + "Y": -67.00244, + "Z": 776.2417 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2011909, + "Position": { + "X": -513.51184, + "Y": -52.689453, + "Z": 773.73914 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1039371, + "Position": { + "X": -409.93365, + "Y": 10.751212, + "Z": 33.035767 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4206_Hamsa Retrieval.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4206_Hamsa Retrieval.json new file mode 100644 index 000000000..fd168aeba --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4206_Hamsa Retrieval.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1037685, + "Position": { + "X": -468.864, + "Y": 6.2912574, + "Z": 3.463745 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -568.1513, + "Y": 40.91181, + "Z": -451.32486 + }, + "StopDistance": 0.5, + "TerritoryId": 957, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 14116 + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1039383, + "Position": { + "X": -567.6509, + "Y": 41.313267, + "Z": -448.41687 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1037685, + "Position": { + "X": -468.864, + "Y": 6.2912574, + "Z": 3.463745 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4207_High Hopes for the Hatchery.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4207_High Hopes for the Hatchery.json new file mode 100644 index 000000000..fae8cdf68 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4207_High Hopes for the Hatchery.json @@ -0,0 +1,246 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1039385, + "Position": { + "X": -480.12518, + "Y": 5.362214, + "Z": 37.582886 + }, + "StopDistance": 0.5, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1039386, + "Position": { + "X": -431.7846, + "Y": 72.61802, + "Z": -555.3826 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -477.78827, + "Y": 73.67918, + "Z": -542.7145 + }, + "TerritoryId": 957, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + } + }, + { + "DataId": 2011962, + "Position": { + "X": -477.16492, + "Y": 74.75391, + "Z": -544.5792 + }, + "TerritoryId": 957, + "InteractionType": "UseItem", + "ItemId": 2003199, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2011963, + "Position": { + "X": -479.2401, + "Y": 74.784424, + "Z": -541.619 + }, + "TerritoryId": 957, + "InteractionType": "UseItem", + "ItemId": 2003199, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ], + "DelaySecondsAtStart": 3 + }, + { + "Position": { + "X": -482.98328, + "Y": 73.32367, + "Z": -521.75024 + }, + "TerritoryId": 957, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + } + }, + { + "DataId": 2011964, + "Position": { + "X": -484.67236, + "Y": 74.021484, + "Z": -523.15564 + }, + "TerritoryId": 957, + "InteractionType": "UseItem", + "ItemId": 2003199, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2011965, + "Position": { + "X": -483.6042, + "Y": 74.35718, + "Z": -519.7986 + }, + "TerritoryId": 957, + "InteractionType": "UseItem", + "ItemId": 2003199, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ], + "DelaySecondsAtStart": 3 + }, + { + "Position": { + "X": -475.0877, + "Y": 73.24273, + "Z": -512.62787 + }, + "TerritoryId": 957, + "InteractionType": "WalkTo" + }, + { + "DataId": 2011967, + "Position": { + "X": -476.92078, + "Y": 74.08252, + "Z": -511.43665 + }, + "TerritoryId": 957, + "InteractionType": "UseItem", + "ItemId": 2003199, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 4 + ] + }, + { + "DataId": 2011966, + "Position": { + "X": -473.0144, + "Y": 74.32666, + "Z": -512.3827 + }, + "TerritoryId": 957, + "InteractionType": "UseItem", + "ItemId": 2003199, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ], + "DelaySecondsAtStart": 3 + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1039386, + "Position": { + "X": -431.7846, + "Y": 72.61802, + "Z": -555.3826 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1039385, + "Position": { + "X": -480.12518, + "Y": 5.362214, + "Z": 37.582886 + }, + "StopDistance": 0.5, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4208_Cutting Edge Solutions.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4208_Cutting Edge Solutions.json new file mode 100644 index 000000000..b7d4c1ec8 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4208_Cutting Edge Solutions.json @@ -0,0 +1,98 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1037673, + "Position": { + "X": -517.0215, + "Y": 11.975277, + "Z": 100.541626 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1039370, + "Position": { + "X": -106.21808, + "Y": 95.53504, + "Z": -700.4959 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1039368, + "Position": { + "X": -65.07977, + "Y": 89.860886, + "Z": -659.8764 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1039369, + "Position": { + "X": -66.14789, + "Y": 89.4264, + "Z": -635.8892 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1037673, + "Position": { + "X": -517.0215, + "Y": 11.975277, + "Z": 100.541626 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4209_Rushing up That Hill.json b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4209_Rushing up That Hill.json new file mode 100644 index 000000000..cc5d7b014 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Side Quests/Thavnair/4209_Rushing up That Hill.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1037681, + "Position": { + "X": -554.74176, + "Y": 11.402611, + "Z": 137.31592 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -281.16296, + "Y": 94.31451, + "Z": -289.12802 + }, + "TerritoryId": 957, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 2011910, + "Position": { + "X": -280.99493, + "Y": 95.87244, + "Z": -287.64783 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1037681, + "Position": { + "X": -554.74176, + "Y": 11.402611, + "Z": 137.31592 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index eab9789a6..d04fd82c5 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -859,7 +859,8 @@ "joy", "mogdance", "salute", - "laugh" + "laugh", + "greeting" ] } } diff --git a/Questionable.Model/Questing/Converter/EmoteConverter.cs b/Questionable.Model/Questing/Converter/EmoteConverter.cs index 714282e46..bdfe5581f 100644 --- a/Questionable.Model/Questing/Converter/EmoteConverter.cs +++ b/Questionable.Model/Questing/Converter/EmoteConverter.cs @@ -43,6 +43,7 @@ public sealed class EmoteConverter() : EnumConverter(Values) { EEmote.Flex, "flex" }, { EEmote.Respect, "respect" }, { EEmote.Box, "box" }, - { EEmote.Uchiwasshoi, "uchiwasshoi" } + { EEmote.Greeting, "greeting" }, + { EEmote.Uchiwasshoi, "uchiwasshoi" }, }; } diff --git a/Questionable.Model/Questing/EEmote.cs b/Questionable.Model/Questing/EEmote.cs index dc4363aee..78e7b6500 100644 --- a/Questionable.Model/Questing/EEmote.cs +++ b/Questionable.Model/Questing/EEmote.cs @@ -44,6 +44,7 @@ public enum EEmote Flex = 139, Respect = 140, Box = 166, + Greeting = 172, Uchiwasshoi = 278 } From 65df686329e03e920bcd6859879b7cc0904200b5 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Wed, 8 Jan 2025 14:02:05 +0000 Subject: [PATCH 081/109] +1979 --- .../Azys Lla/1979_Basic Training.json | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json new file mode 100644 index 000000000..2403b49bb --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012145, + "Position": { + "X": -607.7516, + "Y": -176.4502, + "Z": -527.5502 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -441.42657, + "Y": -167.25401, + "Z": -432.4462 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [4093], + "MinimumKillCount": "5", + "Fly": true, + "$": "5 in close range here, so if any dead it might be a little slower.", + "$.1": "this is the area the quest suggests; there /are/ spinner-rooks sooner, and walking there at level w/o flying might cause interruption, but they're more spread out everywhere else - YMMV." + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012145, + "Position": { + "X": -607.7516, + "Y": -176.4502, + "Z": -527.5502 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 2cfc5256b9156d958234f6f54641859804fd9567 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 8 Jan 2025 21:38:34 +0100 Subject: [PATCH 082/109] Add second Nitowikwe quest --- .../Nitowikwe/5240_The Weight of a Train.json | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json diff --git a/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json new file mode 100644 index 000000000..e2cc56a78 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048605, + "Position": { + "X": -358.38867, + "Y": 19.728025, + "Z": -105.02789 + }, + "TerritoryId": 1190, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Shaaloani - Sheshenewezi Springs", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014456, + "Position": { + "X": -128.64886, + "Y": 16.311829, + "Z": -290.69965 + }, + "TerritoryId": 1190, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1048608, + "Position": { + "X": -126.57361, + "Y": 15.67948, + "Z": -369.46674 + }, + "TerritoryId": 1190, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048605, + "Position": { + "X": -358.38867, + "Y": 19.728025, + "Z": -105.02789 + }, + "TerritoryId": 1190, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 1f4dc134ef0249a805625e3d3b125d7daecff099 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 8 Jan 2025 21:49:03 +0100 Subject: [PATCH 083/109] Add third Nitowikwe quest --- .../Nitowikwe/5240_The Weight of a Train.json | 3 +- .../Nitowikwe/5241_His Heart Blazes On.json | 65 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5241_His Heart Blazes On.json diff --git a/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json index e2cc56a78..e9ea6e574 100644 --- a/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json +++ b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5240_The Weight of a Train.json @@ -67,7 +67,8 @@ }, "TerritoryId": 1190, "InteractionType": "CompleteQuest", - "Fly": true + "Fly": true, + "NextQuestId": 5241 } ] } diff --git a/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5241_His Heart Blazes On.json b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5241_His Heart Blazes On.json new file mode 100644 index 000000000..1fd468d1c --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Custom Deliveries/Nitowikwe/5241_His Heart Blazes On.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -363.2864, + "Y": 20.16234, + "Z": -90.06508 + }, + "TerritoryId": 1190, + "InteractionType": "WalkTo" + }, + { + "DataId": 1051495, + "Position": { + "X": -365.28577, + "Y": 20.14268, + "Z": -88.51758 + }, + "TerritoryId": 1190, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -354.53677, + "Y": 19.32763, + "Z": -99.326805 + }, + "TerritoryId": 1190, + "InteractionType": "WalkTo", + "Mount": true + }, + { + "Position": { + "X": -91.25145, + "Y": 17.80576, + "Z": -267.2748 + }, + "TerritoryId": 1190, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1051497, + "Position": { + "X": -91.5694, + "Y": 17.7503, + "Z": -268.54352 + }, + "TerritoryId": 1190, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From 3889fbfb696a147eb06ebaa08a621890b365b6a8 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Thu, 9 Jan 2025 05:51:09 +0000 Subject: [PATCH 084/109] +1980, de-rust 1979 --- .../Azys Lla/1979_Basic Training.json | 114 +++++++++--------- .../Azys Lla/1980_Good Clean Fun.json | 60 +++++++++ 2 files changed, 119 insertions(+), 55 deletions(-) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1980_Good Clean Fun.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json index 2403b49bb..2955b31fb 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1979_Basic Training.json @@ -1,57 +1,61 @@ { - "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", - "Author": "goatzone", - "QuestSequence": [ - { - "Sequence": 0, - "Steps": [ - { - "DataId": 1012145, - "Position": { - "X": -607.7516, - "Y": -176.4502, - "Z": -527.5502 - }, - "TerritoryId": 402, - "InteractionType": "AcceptQuest" - } - ] - }, - { - "Sequence": 1, - "Steps": [ - { - "Position": { - "X": -441.42657, - "Y": -167.25401, - "Z": -432.4462 - }, - "TerritoryId": 402, - "InteractionType": "Combat", - "EnemySpawnType": "OverworldEnemies", - "KillEnemyDataIds": [4093], - "MinimumKillCount": "5", - "Fly": true, - "$": "5 in close range here, so if any dead it might be a little slower.", - "$.1": "this is the area the quest suggests; there /are/ spinner-rooks sooner, and walking there at level w/o flying might cause interruption, but they're more spread out everywhere else - YMMV." - } - ] - }, - { - "Sequence": 255, - "Steps": [ - { - "DataId": 1012145, - "Position": { - "X": -607.7516, - "Y": -176.4502, - "Z": -527.5502 - }, - "TerritoryId": 402, - "InteractionType": "CompleteQuest", - "Fly": true - } - ] - } - ] + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012145, + "Position": { + "X": -607.7516, + "Y": -176.4502, + "Z": -527.5502 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -441.42657, + "Y": -167.25401, + "Z": -432.4462 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4093, + "MinimumKillCount": 5 + } + ], + "Fly": true, + "$": "5 in close range here, so if any dead it might be a little slower.", + "$.1": "this is the area the quest suggests; there /are/ spinner-rooks sooner, and walking there at level w/o flying might cause interruption, but they're more spread out everywhere else - YMMV." + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012145, + "Position": { + "X": -607.7516, + "Y": -176.4502, + "Z": -527.5502 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] } diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1980_Good Clean Fun.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1980_Good Clean Fun.json new file mode 100644 index 000000000..be941a7ed --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1980_Good Clean Fun.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012146, + "Position": { + "X": -643.76294, + "Y": -176.4502, + "Z": -527.3976 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -439.6144, + "Y": -186.3405, + "Z": -617.2911 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4092, + "MinimumKillCount": 5 + } + ], + "Fly": true, + "$": "by starting here we can guarantee a more sane straightline progression instead of starting in the middle, going all the way to one side, then running all the way to the other side." + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012146, + "Position": { + "X": -643.76294, + "Y": -176.4502, + "Z": -527.3976 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Azys Lla - Helix" + } + ] + } + ] +} From b917cd4e9096a7cd7b075d1f4f0c7ae0e981ddc0 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Thu, 9 Jan 2025 06:03:06 +0000 Subject: [PATCH 085/109] +1981 --- .../1981_General Protection Fault.json | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1981_General Protection Fault.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1981_General Protection Fault.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1981_General Protection Fault.json new file mode 100644 index 000000000..8d59d5441 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1981_General Protection Fault.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012147, + "Position": { + "X": -426.627, + "Y": -162.1281, + "Z": -328.6031 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -528.74396, + "Y": -143.65883, + "Z": -580.686 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [4503], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012147, + "Position": { + "X": -426.627, + "Y": -162.1281, + "Z": -328.6031 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From ba5975e6ffc2e2e912fd4b119399db34b99d74c3 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Thu, 9 Jan 2025 06:15:46 +0000 Subject: [PATCH 086/109] +1982 --- .../Azys Lla/1982_Excessive Force.json | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1982_Excessive Force.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1982_Excessive Force.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1982_Excessive Force.json new file mode 100644 index 000000000..c3906c89e --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1982_Excessive Force.json @@ -0,0 +1,65 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012148, + "Position": { + "X": -173.2663, + "Y": -162.03395, + "Z": -510.39905 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -189.43037, + "Y": -160.1837, + "Z": -499.3027 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4091, + "MinimumKillCount": 3, + "$": "Slay clockwork paladins." + }, + { + "DataId": 4090, + "MinimumKillCount": 3, + "$": "Slay clockwork engineers." + } + ], + "$": "they're all around so we can just start here. possible issue with a FATE spawning here, YMMV." + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012148, + "Position": { + "X": -173.2663, + "Y": -162.03395, + "Z": -510.39905 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From 8d64475f0af6c6533d1e18e3030423c19bb0ce59 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Thu, 9 Jan 2025 06:34:20 +0000 Subject: [PATCH 087/109] +1983 --- .../1983_Chimerical Abominations.json | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1983_Chimerical Abominations.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1983_Chimerical Abominations.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1983_Chimerical Abominations.json new file mode 100644 index 000000000..e84881f97 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1983_Chimerical Abominations.json @@ -0,0 +1,61 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012289, + "Position": { + "X": 231.18933, + "Y": -72.92926, + "Z": -603.1434 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 517.51276, + "Y": -40.378292, + "Z": -785.99677 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4141, + "MinimumKillCount": 2 + } + ], + "Fly": true, + "$": "FATE spawns on top of the suggested area, so we move a bit east." + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012289, + "Position": { + "X": 231.18933, + "Y": -72.92926, + "Z": -603.1434 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 6e19630e605f998d7f5548ec4baf7776b7f9c942 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Thu, 9 Jan 2025 11:39:45 +0000 Subject: [PATCH 088/109] +1984 --- .../Azys Lla/1984_Pollution Solution.json | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1984_Pollution Solution.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1984_Pollution Solution.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1984_Pollution Solution.json new file mode 100644 index 000000000..ef384a78e --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1984_Pollution Solution.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012290, + "Position": { + "X": 760.5248, + "Y": -30.307041, + "Z": -579.67505 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 668.9029, + "Y": -86.006, + "Z": -775.5664 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4046, + "MinimumKillCount": 4 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012290, + "Position": { + "X": 760.5248, + "Y": -30.307041, + "Z": -579.67505 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 8d18b243527177dea9735da84d997d100be5bf97 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Thu, 9 Jan 2025 16:52:15 +0000 Subject: [PATCH 089/109] +1985 --- .../Azys Lla/1985_Good Hunting.json | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1985_Good Hunting.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1985_Good Hunting.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1985_Good Hunting.json new file mode 100644 index 000000000..689b47bbd --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1985_Good Hunting.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012291, + "Position": { + "X": 804.074, + "Y": -26.326342, + "Z": -527.48914 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 355.31863, + "Y": -46.22946, + "Z": -507.70428 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4072, + "MinimumKillCount": 4 + } + ], + "Fly": true, + "$": "we go to the west of the marked area to avoid idling in the FATE that spawns on the east of it; we'll still path through it when we expend all the westward mobs, but that's just how they spawn, shrugging emoji." + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012291, + "Position": { + "X": 804.074, + "Y": -26.326342, + "Z": -527.48914 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 1773afea46e09f56ab6da65035985a429c4ee535 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 9 Jan 2025 19:34:16 +0100 Subject: [PATCH 090/109] GatheringPathRenderer: minor updates --- Directory.Build.targets | 2 +- GatheringPathRenderer/.gitignore | 1 + GatheringPathRenderer/DalamudPackager.targets | 21 +++ .../GatheringPathRenderer.csproj | 8 + .../GatheringPathRenderer.json | 5 +- GatheringPathRenderer/RendererPlugin.cs | 22 ++- GatheringPathRenderer/Windows/ConfigWindow.cs | 33 +++++ GatheringPathRenderer/Windows/EditorWindow.cs | 19 ++- .../1002_Yawtanane Grasslands_BTN.json | 138 ++++++++++++++++++ 9 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 GatheringPathRenderer/.gitignore create mode 100644 GatheringPathRenderer/DalamudPackager.targets create mode 100644 GatheringPathRenderer/Windows/ConfigWindow.cs create mode 100644 GatheringPaths/7.x - Dawntrail/Shaaloani/1002_Yawtanane Grasslands_BTN.json diff --git a/Directory.Build.targets b/Directory.Build.targets index 9c7a8c24a..58a5fad2f 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - + 4.13 diff --git a/GatheringPathRenderer/.gitignore b/GatheringPathRenderer/.gitignore new file mode 100644 index 000000000..a60a458a9 --- /dev/null +++ b/GatheringPathRenderer/.gitignore @@ -0,0 +1 @@ +/dist diff --git a/GatheringPathRenderer/DalamudPackager.targets b/GatheringPathRenderer/DalamudPackager.targets new file mode 100644 index 000000000..7f129a87a --- /dev/null +++ b/GatheringPathRenderer/DalamudPackager.targets @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/GatheringPathRenderer/GatheringPathRenderer.csproj b/GatheringPathRenderer/GatheringPathRenderer.csproj index 6009a5183..73d05cbeb 100644 --- a/GatheringPathRenderer/GatheringPathRenderer.csproj +++ b/GatheringPathRenderer/GatheringPathRenderer.csproj @@ -1,4 +1,11 @@ + + 0.1 + dist + $(SolutionDir)=X:\ + x64 + + @@ -6,4 +13,5 @@ + diff --git a/GatheringPathRenderer/GatheringPathRenderer.json b/GatheringPathRenderer/GatheringPathRenderer.json index 8d68d1d89..56f917099 100644 --- a/GatheringPathRenderer/GatheringPathRenderer.json +++ b/GatheringPathRenderer/GatheringPathRenderer.json @@ -1,6 +1,7 @@ { "Name": "GatheringPathRenderer", "Author": "Liza Carvelli", - "Punchline": "dev only plugin: Renders gathering location.", - "Description": "dev only plugin: Renders gathering location (without ECommons polluting the entire normal project)." + "Punchline": "[Questionable dev plugin]: Renders gathering location.", + "Description": "[Questionable dev plugin]: Renders gathering location using Splatoon.", + "RepoUrl": "https://git.carvel.li/liza/Questionable/src/branch/master/GatheringPathRenderer" } diff --git a/GatheringPathRenderer/RendererPlugin.cs b/GatheringPathRenderer/RendererPlugin.cs index 5ef430eae..02e01bb70 100644 --- a/GatheringPathRenderer/RendererPlugin.cs +++ b/GatheringPathRenderer/RendererPlugin.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Text.Encodings.Web; @@ -17,11 +18,11 @@ using ECommons.Schedulers; using ECommons.SplatoonAPI; using GatheringPathRenderer.Windows; using LLib.GameData; -using Questionable.Model; using Questionable.Model.Gathering; namespace GatheringPathRenderer; +[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] public sealed class RendererPlugin : IDalamudPlugin { private const long OnTerritoryChange = -2; @@ -56,8 +57,10 @@ public sealed class RendererPlugin : IDalamudPlugin _editorCommands = new EditorCommands(this, dataManager, commandManager, targetManager, clientState, chatGui, configuration); - _editorWindow = new EditorWindow(this, _editorCommands, dataManager, targetManager, clientState, objectTable) + var configWindow = new ConfigWindow(pluginInterface, configuration); + _editorWindow = new EditorWindow(this, _editorCommands, dataManager, targetManager, clientState, objectTable, configWindow) { IsOpen = true }; + _windowSystem.AddWindow(configWindow); _windowSystem.AddWindow(_editorWindow); _currentClassJob = (EClassJob?)_clientState.LocalPlayer?.ClassJob.RowId ?? EClassJob.Adventurer; @@ -78,6 +81,7 @@ public sealed class RendererPlugin : IDalamudPlugin { get { +#if DEBUG DirectoryInfo? solutionDirectory = _pluginInterface.AssemblyLocation.Directory?.Parent?.Parent?.Parent; if (solutionDirectory != null) { @@ -88,6 +92,12 @@ public sealed class RendererPlugin : IDalamudPlugin } throw new Exception("Unable to resolve project path"); +#else + var allPluginsDirectory = _pluginInterface.ConfigFile.Directory ?? throw new Exception("Unknown directory for plugin configs"); + return allPluginsDirectory + .CreateSubdirectory("Questionable") + .CreateSubdirectory("GatheringPaths"); +#endif } } @@ -103,12 +113,18 @@ public sealed class RendererPlugin : IDalamudPlugin try { +#if DEBUG foreach (var expansionFolder in ExpansionData.ExpansionFolders.Values) LoadFromDirectory( new DirectoryInfo(Path.Combine(PathsDirectory.FullName, expansionFolder))); - _pluginLog.Information( $"Loaded {_gatheringLocations.Count} gathering root locations from project directory"); +#else + LoadFromDirectory(PathsDirectory); + _pluginLog.Information( + $"Loaded {_gatheringLocations.Count} gathering root locations from {PathsDirectory.FullName} directory"); +#endif + } catch (Exception e) { diff --git a/GatheringPathRenderer/Windows/ConfigWindow.cs b/GatheringPathRenderer/Windows/ConfigWindow.cs new file mode 100644 index 000000000..0e9ba04cf --- /dev/null +++ b/GatheringPathRenderer/Windows/ConfigWindow.cs @@ -0,0 +1,33 @@ +using Dalamud.Interface.Windowing; +using Dalamud.Plugin; +using ImGuiNET; + +namespace GatheringPathRenderer.Windows; + +internal sealed class ConfigWindow : Window +{ + private readonly IDalamudPluginInterface _pluginInterface; + private readonly Configuration _configuration; + + public ConfigWindow(IDalamudPluginInterface pluginInterface, Configuration configuration) + : base("Gathering Path Config", ImGuiWindowFlags.AlwaysAutoResize) + { + _pluginInterface = pluginInterface; + _configuration = configuration; + + AllowPinning = false; + AllowClickthrough = false; + } + + public override void Draw() + { + string authorName = _configuration.AuthorName; + if (ImGui.InputText("Author name for new files", ref authorName, 256)) + { + _configuration.AuthorName = authorName; + Save(); + } + } + + private void Save() => _pluginInterface.SavePluginConfig(_configuration); +} diff --git a/GatheringPathRenderer/Windows/EditorWindow.cs b/GatheringPathRenderer/Windows/EditorWindow.cs index 1150558fa..c117f4a9b 100644 --- a/GatheringPathRenderer/Windows/EditorWindow.cs +++ b/GatheringPathRenderer/Windows/EditorWindow.cs @@ -6,6 +6,7 @@ using System.Numerics; using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects.Enums; using Dalamud.Game.ClientState.Objects.Types; +using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Windowing; using Dalamud.Plugin.Services; @@ -32,8 +33,8 @@ internal sealed class EditorWindow : Window _targetLocation; public EditorWindow(RendererPlugin plugin, EditorCommands editorCommands, IDataManager dataManager, - ITargetManager targetManager, IClientState clientState, IObjectTable objectTable) - : base("Gathering Path Editor###QuestionableGatheringPathEditor", + ITargetManager targetManager, IClientState clientState, IObjectTable objectTable, ConfigWindow configWindow) + : base($"Gathering Path Editor {typeof(EditorWindow).Assembly.GetName().Version!.ToString(2)}###QuestionableGatheringPathEditor", ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoNavFocus | ImGuiWindowFlags.AlwaysAutoResize) { _plugin = plugin; @@ -48,6 +49,20 @@ internal sealed class EditorWindow : Window MinimumSize = new Vector2(300, 100), }; + TitleBarButtons.Add(new TitleBarButton + { + Icon = FontAwesomeIcon.Cog, + IconOffset = new Vector2(1.5f, 1), + Click = _ => configWindow.IsOpen = true, + Priority = int.MinValue, + ShowTooltip = () => + { + ImGui.BeginTooltip(); + ImGui.Text("Open Configuration"); + ImGui.EndTooltip(); + } + }); + RespectCloseHotkey = false; ShowCloseButton = false; AllowPinning = false; diff --git a/GatheringPaths/7.x - Dawntrail/Shaaloani/1002_Yawtanane Grasslands_BTN.json b/GatheringPaths/7.x - Dawntrail/Shaaloani/1002_Yawtanane Grasslands_BTN.json new file mode 100644 index 000000000..44d84892c --- /dev/null +++ b/GatheringPaths/7.x - Dawntrail/Shaaloani/1002_Yawtanane Grasslands_BTN.json @@ -0,0 +1,138 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "liza", + "Steps": [ + { + "TerritoryId": 1190, + "InteractionType": "None" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 34920, + "Locations": [ + { + "Position": { + "X": 192.6021, + "Y": 12.31054, + "Z": 631.2545 + } + }, + { + "Position": { + "X": 194.8373, + "Y": 12.50387, + "Z": 646.5401 + } + }, + { + "Position": { + "X": 180.8447, + "Y": 12.43262, + "Z": 610.7131 + } + } + ] + }, + { + "DataId": 34919, + "Locations": [ + { + "Position": { + "X": 186.171, + "Y": 12.54104, + "Z": 634.9042 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34917, + "Locations": [ + { + "Position": { + "X": 39.45634, + "Y": -0.06042051, + "Z": 502.3853 + } + } + ] + }, + { + "DataId": 34918, + "Locations": [ + { + "Position": { + "X": 46.03248, + "Y": -0.7049216, + "Z": 491.6059 + } + }, + { + "Position": { + "X": 36.15481, + "Y": -0.0501074, + "Z": 505.9388 + } + }, + { + "Position": { + "X": 24.72226, + "Y": 0.5922582, + "Z": 528.0809 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 34922, + "Locations": [ + { + "Position": { + "X": 2.302937, + "Y": -4.586716, + "Z": 687.4797 + } + }, + { + "Position": { + "X": 30.02284, + "Y": -2.447479, + "Z": 704.4326 + } + }, + { + "Position": { + "X": 41.59287, + "Y": -0.8454803, + "Z": 692.0099 + } + } + ] + }, + { + "DataId": 34921, + "Locations": [ + { + "Position": { + "X": 18.47237, + "Y": -2.987581, + "Z": 690.8011 + } + } + ] + } + ] + } + ] +} \ No newline at end of file From 4dc89d8ed34fb98bdc058a1cc3301fb1b70f9fc4 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 9 Jan 2025 19:48:27 +0100 Subject: [PATCH 091/109] GatheringPathRenderer: minor updates --- GatheringPathRenderer/RendererPlugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GatheringPathRenderer/RendererPlugin.cs b/GatheringPathRenderer/RendererPlugin.cs index 02e01bb70..93c666a8c 100644 --- a/GatheringPathRenderer/RendererPlugin.cs +++ b/GatheringPathRenderer/RendererPlugin.cs @@ -114,7 +114,7 @@ public sealed class RendererPlugin : IDalamudPlugin try { #if DEBUG - foreach (var expansionFolder in ExpansionData.ExpansionFolders.Values) + foreach (var expansionFolder in Questionable.Model.ExpansionData.ExpansionFolders.Values) LoadFromDirectory( new DirectoryInfo(Path.Combine(PathsDirectory.FullName, expansionFolder))); _pluginLog.Information( From 9c5fd2d3feb739e0acc2ce9c545c83ab12750367 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Thu, 9 Jan 2025 20:50:18 +0000 Subject: [PATCH 092/109] +1986 --- .../Azys Lla/1986_Defense Protocols.json | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1986_Defense Protocols.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1986_Defense Protocols.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1986_Defense Protocols.json new file mode 100644 index 000000000..ce12a0943 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1986_Defense Protocols.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012292, + "Position": { + "X": 583.9779, + "Y": 10.93506, + "Z": 100.02283 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 773.4017, + "Y": -0.06258035, + "Z": 147.04689 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [4669, 4970, 4671, 4672, 4673], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012292, + "Position": { + "X": 583.9779, + "Y": 10.93506, + "Z": 100.02283 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 880082da0e464665173eb8f4c0addb9866580891 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Fri, 10 Jan 2025 13:35:19 +0000 Subject: [PATCH 093/109] +1987 --- .../Side Quests/Azys Lla/1987_Snikt.json | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1987_Snikt.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1987_Snikt.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1987_Snikt.json new file mode 100644 index 000000000..42a0325a2 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1987_Snikt.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012293, + "Position": { + "X": 573.4187, + "Y": 13.072888, + "Z": 329.2439 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 495.16974, + "Y": 31.67624, + "Z": 517.37463 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4083, + "MinimumKillCount": 4 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012293, + "Position": { + "X": 573.4187, + "Y": 13.072888, + "Z": 329.2439 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 8d4b2320fb5b3bd18c7bed6ea5c6097b82de8c12 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Fri, 10 Jan 2025 13:58:21 +0000 Subject: [PATCH 094/109] +1988 --- .../Azys Lla/1988_A Crude Facsimile.json | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json new file mode 100644 index 000000000..0b4183996 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012294, + "Position": { + "X": 366.4148, + "Y": 20.214104, + "Z": 756.7101 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 502.06363, + "Y": 16.87959, + "Z": 742.68134 + }, + "TerritoryId": 402, + "InteractionType": "WalkTo", + "Fly": true, + "$": "can get stuck on the spire structure when trying to land" + }, + { + "DataId": 2005900, + "Position": { + "X": 506.76733, + "Y": 16.861145, + "Z": 750.24023 + }, + "TerritoryId": 402, + "InteractionType": "Interact" + }, + { + "DataId": 2005903, + "Position": { + "X": 544.64014, + "Y": 15.945618, + "Z": 760.61633 + }, + "TerritoryId": 402, + "InteractionType": "Interact" + }, + { + "DataId": 2005899, + "Position": { + "X": 545.4031, + "Y": 20.2182, + "Z": 802.8534 + }, + "TerritoryId": 402, + "InteractionType": "Interact" + }, + { + "DataId": 2005902, + "Position": { + "X": 614.6791, + "Y": 20.2182, + "Z": 758.938 + }, + "TerritoryId": 402, + "InteractionType": "Interact" + }, + { + "DataId": 2005901, + "Position": { + "X": 605.3406, + "Y": 15.945618, + "Z": 708.06433 + }, + "TerritoryId": 402, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012294, + "Position": { + "X": 366.4148, + "Y": 20.214104, + "Z": 756.7101 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 250cb44f484af417e61ce43430726a802e9b4d33 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Fri, 10 Jan 2025 14:30:20 +0000 Subject: [PATCH 095/109] +1989 --- .../Azys Lla/1988_A Crude Facsimile.json | 2 +- .../Side Quests/Azys Lla/1989_Recycling.json | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1989_Recycling.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json index 0b4183996..969da2d85 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json @@ -30,7 +30,7 @@ "TerritoryId": 402, "InteractionType": "WalkTo", "Fly": true, - "$": "can get stuck on the spire structure when trying to land" + "$": "can get stuck on the spire structure when trying to land. could land elsewhere but we want to start with this one because it's the first on foot, so if done before flying unlocked that would necessitate walking directly past it." }, { "DataId": 2005900, diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1989_Recycling.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1989_Recycling.json new file mode 100644 index 000000000..1541b26df --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1989_Recycling.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012295, + "Position": { + "X": 214.64856, + "Y": 13.75853, + "Z": 536.9801 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 144.31177, + "Y": 5.9740877, + "Z": 387.8086 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4630, + "MinimumKillCount": 3 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012295, + "Position": { + "X": 214.64856, + "Y": 13.75853, + "Z": 536.9801 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 7fe5acbaca396c0a4a8763b5a3e616d0b822e42a Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Fri, 10 Jan 2025 15:07:11 +0000 Subject: [PATCH 096/109] +1990 --- .../1990_Inadequate Safety Measures.json | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1990_Inadequate Safety Measures.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1990_Inadequate Safety Measures.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1990_Inadequate Safety Measures.json new file mode 100644 index 000000000..e9a8aff84 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1990_Inadequate Safety Measures.json @@ -0,0 +1,85 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012296, + "Position": { + "X": -658.32, + "Y": -75.48534, + "Z": 699.1531 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -345.30673, + "Y": -89.61499, + "Z": 353.53 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4075, + "MinimumKillCount": 3 + } + ], + "CompletionQuestVariablesFlags": [ + { "Low": 3 }, + null, + null, + null, + null, + null + ], + "Fly": true + }, + { + "Position": { + "X": -553.4664, + "Y": -104.895905, + "Z": 175.68343 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4668, + "MinimumKillCount": 3 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012296, + "Position": { + "X": -658.32, + "Y": -75.48534, + "Z": 699.1531 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From ec813ce9f4ece949500d866e19d359864f2ed559 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Fri, 10 Jan 2025 15:20:27 +0000 Subject: [PATCH 097/109] +1991 --- .../1991_Environmental Unbalance.json | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1991_Environmental Unbalance.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1991_Environmental Unbalance.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1991_Environmental Unbalance.json new file mode 100644 index 000000000..701a787c8 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1991_Environmental Unbalance.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012297, + "Position": { + "X": -554.95544, + "Y": -89.69182, + "Z": 771.87756 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -679.16223, + "Y": -48.151093, + "Z": 542.7097 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 4095, + "MinimumKillCount": 4 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012297, + "Position": { + "X": -554.95544, + "Y": -89.69182, + "Z": 771.87756 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 93e6b6ec02dff2bcd26c4aa2b18c73d6b0bcaff2 Mon Sep 17 00:00:00 2001 From: Stefan Belmont Date: Fri, 10 Jan 2025 15:42:38 +0000 Subject: [PATCH 098/109] +1992 --- .../1992_Elevated Aggression Levels.json | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json new file mode 100644 index 000000000..e3a7106c5 --- /dev/null +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012298, + "Position": { + "X": -192.67572, + "Y": -102.749916, + "Z": 476.9817 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -375.98807, + "Y": -106.10026, + "Z": 710.48956 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "ComplexCombatData": [ + { + "DataId": 4493, + "MinimumKillCount": 1 + } + ], + "CompletionQuestVariablesFlags": [null, null, null, null, null, 128], + "Fly": true + }, + { + "Position": { + "X": -372.88766, + "Y": -105.78837, + "Z": 746.95245 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "ComplexCombatData": [ + { + "DataId": 4493, + "MinimumKillCount": 1 + } + ], + "CompletionQuestVariablesFlags": [null, null, null, null, null, 64] + }, + { + "Position": { + "X": -321.94852, + "Y": -106.57244, + "Z": 716.5662 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "ComplexCombatData": [ + { + "DataId": 4493, + "MinimumKillCount": 1 + } + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012298, + "Position": { + "X": -192.67572, + "Y": -102.749916, + "Z": 476.9817 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} From 8200342f2fcfde6022090595acd2d2b23cda8ae6 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 10 Jan 2025 17:01:37 +0100 Subject: [PATCH 099/109] Update icon for journal --- .../Windows/QuestComponents/QuickAccessButtonsComponent.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs b/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs index 6093686a8..0239d09b1 100644 --- a/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs +++ b/Questionable/Windows/QuestComponents/QuickAccessButtonsComponent.cs @@ -91,8 +91,10 @@ internal sealed class QuickAccessButtonsComponent Reload?.Invoke(this, EventArgs.Empty); ImGui.SameLine(); - if (ImGuiComponents.IconButton(FontAwesomeIcon.ChartColumn)) + if (ImGuiComponents.IconButton(FontAwesomeIcon.BookBookmark)) _journalProgressWindow.IsOpen = true; + if (ImGui.IsItemHovered()) + ImGui.SetTooltip("Journal Progress"); if (_questRegistry.ValidationIssueCount > 0) From 108d103fd872805dd81f2526716a45d5c7cd78a2 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 11 Jan 2025 16:54:55 +0100 Subject: [PATCH 100/109] Add some extra flight steps to avoid vnav issues; fix bad NextQuestId --- .../1762_The Secret to Success.json | 5 ++-- .../1765_Intermediate Dragonslaying.json | 8 ++++--- .../1766_Advanced Dragonslaying.json | 12 ++++++---- .../1890_Personal Effects.json | 23 ++++++++++++++++--- .../1892_A Missing Tooth.json | 4 ++-- .../1893_A Noble Purpose.json | 5 ++-- .../Side Quests/Ishgard/1873_Enlisted.json | 17 +++++++++++++- 7 files changed, 57 insertions(+), 17 deletions(-) diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json index 1c16e3f1b..449db054c 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1762_The Secret to Success.json @@ -117,9 +117,10 @@ "Z": 4.5318604 }, "TerritoryId": 397, - "InteractionType": "CompleteQuest" + "InteractionType": "CompleteQuest", + "NextQuestId": 1764 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json index ae7e2afef..4bea24395 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1765_Intermediate Dragonslaying.json @@ -28,7 +28,8 @@ "Z": -244.1596 }, "TerritoryId": 397, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -89,9 +90,10 @@ }, "TerritoryId": 397, "InteractionType": "CompleteQuest", - "NextQuestId": 1766 + "NextQuestId": 1766, + "Fly": true } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json index 4f9d54e23..aadaebf07 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1766_Advanced Dragonslaying.json @@ -28,7 +28,8 @@ "Z": -244.1596 }, "TerritoryId": 397, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -58,12 +59,14 @@ "Y": 100.08534, "Z": -603.926 }, + "StopDistance": 0.5, "TerritoryId": 397, "InteractionType": "Combat", "KillEnemyDataIds": [ 4468 ], - "EnemySpawnType": "AutoOnEnterArea" + "EnemySpawnType": "AutoOnEnterArea", + "Fly": true } ] }, @@ -78,7 +81,8 @@ "Z": -503.7156 }, "TerritoryId": 397, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -100,4 +104,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json index bddb06053..683419858 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1890_Personal Effects.json @@ -34,7 +34,8 @@ "DataId": 3992, "MinimumKillCount": 5 } - ] + ], + "Fly": true } ] }, @@ -50,13 +51,29 @@ "Z": 791.37854 }, "TerritoryId": 397, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Coerthas Western Highlands - Falcon's Nest" } ] }, { "Sequence": 255, "Steps": [ + { + "Position": { + "X": -110.26132, + "Y": 153.61101, + "Z": 10.394781 + }, + "TerritoryId": 397, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "Flying": "Locked" + } + } + }, { "Fly": true, "DataId": 1014146, @@ -72,4 +89,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json index 657fd96f8..d0ee8c1ca 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1892_A Missing Tooth.json @@ -75,9 +75,9 @@ }, "TerritoryId": 397, "InteractionType": "CompleteQuest", - "NextQuestId": 1983 + "NextQuestId": 1893 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json index 7a5a5c64e..c5a003fc7 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Coerthas Western Highlands/1893_A Noble Purpose.json @@ -104,9 +104,10 @@ "Z": 3.829956 }, "TerritoryId": 397, - "InteractionType": "CompleteQuest" + "InteractionType": "CompleteQuest", + "NextQuestId": 1898 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json index ef0a9cbde..c603466de 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Ishgard/1873_Enlisted.json @@ -36,6 +36,21 @@ { "Sequence": 255, "Steps": [ + { + "Position": { + "X": -110.26132, + "Y": 153.61101, + "Z": 10.394781 + }, + "TerritoryId": 397, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "Flying": "Locked" + } + } + }, { "DataId": 1014719, "Position": { @@ -50,4 +65,4 @@ ] } ] -} \ No newline at end of file +} From ad76ccf05798cb6d6a3771e42aeb34103b23d614 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 11 Jan 2025 17:00:04 +0100 Subject: [PATCH 101/109] =?UTF-8?q?Make=20'CompleteQuest'=20work=20with=20?= =?UTF-8?q?ItemId=20=E2=86=92=20UseItem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Questionable/Controller/Steps/Interactions/UseItem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Questionable/Controller/Steps/Interactions/UseItem.cs b/Questionable/Controller/Steps/Interactions/UseItem.cs index 118c204aa..bf779a024 100644 --- a/Questionable/Controller/Steps/Interactions/UseItem.cs +++ b/Questionable/Controller/Steps/Interactions/UseItem.cs @@ -29,7 +29,7 @@ internal static class UseItem { public IEnumerable CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) { - if (step.InteractionType is EInteractionType.SinglePlayerDuty) + if (step.InteractionType is EInteractionType.SinglePlayerDuty or EInteractionType.CompleteQuest) { if (step.ItemId == null) return []; From 97cbeada2a45e76b59fd4b7e770ffedc2c39b366 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 12 Jan 2025 02:13:23 +0100 Subject: [PATCH 102/109] Minor Azys Lla adjustments --- .../Azys Lla/1988_A Crude Facsimile.json | 256 +++++++++++------- .../1992_Elevated Aggression Levels.json | 206 +++++++------- 2 files changed, 268 insertions(+), 194 deletions(-) diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json index 969da2d85..18eef643f 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1988_A Crude Facsimile.json @@ -1,104 +1,156 @@ { - "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", - "Author": "goatzone", - "QuestSequence": [ - { - "Sequence": 0, - "Steps": [ - { - "DataId": 1012294, - "Position": { - "X": 366.4148, - "Y": 20.214104, - "Z": 756.7101 - }, - "TerritoryId": 402, - "InteractionType": "AcceptQuest", - "Fly": true - } - ] - }, - { - "Sequence": 1, - "Steps": [ - { - "Position": { - "X": 502.06363, - "Y": 16.87959, - "Z": 742.68134 - }, - "TerritoryId": 402, - "InteractionType": "WalkTo", - "Fly": true, - "$": "can get stuck on the spire structure when trying to land. could land elsewhere but we want to start with this one because it's the first on foot, so if done before flying unlocked that would necessitate walking directly past it." - }, - { - "DataId": 2005900, - "Position": { - "X": 506.76733, - "Y": 16.861145, - "Z": 750.24023 - }, - "TerritoryId": 402, - "InteractionType": "Interact" - }, - { - "DataId": 2005903, - "Position": { - "X": 544.64014, - "Y": 15.945618, - "Z": 760.61633 - }, - "TerritoryId": 402, - "InteractionType": "Interact" - }, - { - "DataId": 2005899, - "Position": { - "X": 545.4031, - "Y": 20.2182, - "Z": 802.8534 - }, - "TerritoryId": 402, - "InteractionType": "Interact" - }, - { - "DataId": 2005902, - "Position": { - "X": 614.6791, - "Y": 20.2182, - "Z": 758.938 - }, - "TerritoryId": 402, - "InteractionType": "Interact" - }, - { - "DataId": 2005901, - "Position": { - "X": 605.3406, - "Y": 15.945618, - "Z": 708.06433 - }, - "TerritoryId": 402, - "InteractionType": "Interact" - } - ] - }, - { - "Sequence": 255, - "Steps": [ - { - "DataId": 1012294, - "Position": { - "X": 366.4148, - "Y": 20.214104, - "Z": 756.7101 - }, - "TerritoryId": 402, - "InteractionType": "CompleteQuest", - "Fly": true - } - ] - } - ] + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012294, + "Position": { + "X": 366.4148, + "Y": 20.214104, + "Z": 756.7101 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 505.4667, + "Y": 16.87959, + "Z": 751.14856 + }, + "TerritoryId": 402, + "InteractionType": "WalkTo", + "Fly": true, + "$": "can get stuck on the spire structure when trying to land. could land elsewhere but we want to start with this one because it's the first on foot, so if done before flying unlocked that would necessitate walking directly past it.", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + } + }, + { + "DataId": 2005900, + "Position": { + "X": 506.76733, + "Y": 16.861145, + "Z": 750.24023 + }, + "TerritoryId": 402, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2005903, + "Position": { + "X": 544.64014, + "Y": 15.945618, + "Z": 760.61633 + }, + "TerritoryId": 402, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + }, + { + "DataId": 2005899, + "Position": { + "X": 545.4031, + "Y": 20.2182, + "Z": 802.8534 + }, + "TerritoryId": 402, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2005902, + "Position": { + "X": 614.6791, + "Y": 20.2182, + "Z": 758.938 + }, + "TerritoryId": 402, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 2005901, + "Position": { + "X": 605.3406, + "Y": 15.945618, + "Z": 708.06433 + }, + "TerritoryId": 402, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012294, + "Position": { + "X": 366.4148, + "Y": 20.214104, + "Z": 756.7101 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] } diff --git a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json index e3a7106c5..b41f31b3e 100644 --- a/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json +++ b/QuestPaths/3.x - Heavensward/Side Quests/Azys Lla/1992_Elevated Aggression Levels.json @@ -1,94 +1,116 @@ { - "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", - "Author": "goatzone", - "QuestSequence": [ - { - "Sequence": 0, - "Steps": [ - { - "DataId": 1012298, - "Position": { - "X": -192.67572, - "Y": -102.749916, - "Z": 476.9817 - }, - "TerritoryId": 402, - "InteractionType": "AcceptQuest", - "Fly": true - } - ] - }, - { - "Sequence": 1, - "Steps": [ - { - "Position": { - "X": -375.98807, - "Y": -106.10026, - "Z": 710.48956 - }, - "TerritoryId": 402, - "InteractionType": "Combat", - "EnemySpawnType": "AutoOnEnterArea", - "ComplexCombatData": [ - { - "DataId": 4493, - "MinimumKillCount": 1 - } - ], - "CompletionQuestVariablesFlags": [null, null, null, null, null, 128], - "Fly": true - }, - { - "Position": { - "X": -372.88766, - "Y": -105.78837, - "Z": 746.95245 - }, - "TerritoryId": 402, - "InteractionType": "Combat", - "EnemySpawnType": "AutoOnEnterArea", - "ComplexCombatData": [ - { - "DataId": 4493, - "MinimumKillCount": 1 - } - ], - "CompletionQuestVariablesFlags": [null, null, null, null, null, 64] - }, - { - "Position": { - "X": -321.94852, - "Y": -106.57244, - "Z": 716.5662 - }, - "TerritoryId": 402, - "InteractionType": "Combat", - "EnemySpawnType": "AutoOnEnterArea", - "ComplexCombatData": [ - { - "DataId": 4493, - "MinimumKillCount": 1 - } - ] - } - ] - }, - { - "Sequence": 255, - "Steps": [ - { - "DataId": 1012298, - "Position": { - "X": -192.67572, - "Y": -102.749916, - "Z": 476.9817 - }, - "TerritoryId": 402, - "InteractionType": "CompleteQuest", - "Fly": true - } - ] - } - ] + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "goatzone", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1012298, + "Position": { + "X": -192.67572, + "Y": -102.749916, + "Z": 476.9817 + }, + "TerritoryId": 402, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -375.98807, + "Y": -106.10026, + "Z": 710.48956 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "ComplexCombatData": [ + { + "DataId": 4493, + "MinimumKillCount": 1 + } + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], + "Fly": true + }, + { + "Position": { + "X": -372.88766, + "Y": -105.78837, + "Z": 746.95245 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "ComplexCombatData": [ + { + "DataId": 4493, + "MinimumKillCount": 1 + } + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -321.94852, + "Y": -106.57244, + "Z": 716.5662 + }, + "TerritoryId": 402, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "ComplexCombatData": [ + { + "DataId": 4493, + "MinimumKillCount": 1 + } + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1012298, + "Position": { + "X": -192.67572, + "Y": -102.749916, + "Z": 476.9817 + }, + "TerritoryId": 402, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] } From a111a4f75b8a8bf6687da465dba5763e00a895e0 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 12 Jan 2025 02:28:31 +0100 Subject: [PATCH 103/109] Optimize combat for overworld enemies --- Questionable/Controller/CombatController.cs | 88 +++++++++++++++++-- Questionable/Controller/MiniTaskController.cs | 2 +- .../Controller/Steps/Interactions/Combat.cs | 23 +++-- 3 files changed, 102 insertions(+), 11 deletions(-) diff --git a/Questionable/Controller/CombatController.cs b/Questionable/Controller/CombatController.cs index f44c4934d..73fe17dfc 100644 --- a/Questionable/Controller/CombatController.cs +++ b/Questionable/Controller/CombatController.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Numerics; using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects; using Dalamud.Game.ClientState.Objects.Enums; @@ -10,7 +11,8 @@ using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Object; using FFXIVClientStructs.FFXIV.Client.Game.UI; -using FFXIVClientStructs.FFXIV.Common.Math; +using FFXIVClientStructs.FFXIV.Client.System.Framework; +using FFXIVClientStructs.FFXIV.Common.Component.BGCollision; using Microsoft.Extensions.Logging; using Questionable.Controller.CombatModules; using Questionable.Controller.Steps; @@ -38,6 +40,7 @@ internal sealed class CombatController : IDisposable private CurrentFight? _currentFight; private bool _wasInCombat; private ulong? _lastTargetId; + private List? _previousQuestVariables; public CombatController( IEnumerable combatModules, @@ -79,7 +82,9 @@ internal sealed class CombatController : IDisposable Data = combatData, LastDistanceCheck = DateTime.Now, }; - _wasInCombat = combatData.SpawnType is EEnemySpawnType.QuestInterruption or EEnemySpawnType.FinishCombatIfAny; + _wasInCombat = + combatData.SpawnType is EEnemySpawnType.QuestInterruption or EEnemySpawnType.FinishCombatIfAny; + UpdateLastTargetAndQuestVariables(null); return true; } else @@ -115,7 +120,31 @@ internal sealed class CombatController : IDisposable { // wait until the game cleans up the target if (lastTarget.IsDead) - return EStatus.InCombat; + { + ElementId? elementId = _currentFight.Data.ElementId; + QuestProgressInfo? questProgressInfo = elementId != null + ? _questFunctions.GetQuestProgressInfo(elementId) + : null; + + if (questProgressInfo != null && + questProgressInfo.Sequence == _currentFight.Data.Sequence && + QuestWorkUtils.HasCompletionFlags(_currentFight.Data.CompletionQuestVariablesFlags) && + QuestWorkUtils.MatchesQuestWork(_currentFight.Data.CompletionQuestVariablesFlags, + questProgressInfo)) + { + // would be the final enemy of the bunch + return EStatus.InCombat; + } + else if (questProgressInfo != null && + questProgressInfo.Sequence == _currentFight.Data.Sequence && + _previousQuestVariables != null && + !questProgressInfo.Variables.SequenceEqual(_previousQuestVariables)) + { + UpdateLastTargetAndQuestVariables(null); + } + else + return EStatus.InCombat; + } } else _lastTargetId = null; @@ -372,9 +401,18 @@ internal sealed class CombatController : IDisposable float hitboxOffset = player.HitboxRadius + gameObject.HitboxRadius; float actualDistance = Vector3.Distance(player.Position, gameObject.Position); float maxDistance = player.ClassJob.ValueNullable?.Role is 3 or 4 ? 20f : 2.9f; - if (actualDistance - hitboxOffset >= maxDistance) + bool outOfRange = actualDistance - hitboxOffset >= maxDistance; + bool isInLineOfSight = IsInLineOfSight(gameObject); + if (outOfRange || !isInLineOfSight) { - if (actualDistance - hitboxOffset <= 5) + bool useNavmesh = actualDistance - hitboxOffset > 5f; + if (!outOfRange && !isInLineOfSight) + { + maxDistance = Math.Min(maxDistance, actualDistance) / 2; + useNavmesh = true; + } + + if (!useNavmesh) { _logger.LogInformation("Moving to {TargetName} ({DataId}) to attack", gameObject.Name, gameObject.DataId); @@ -391,6 +429,44 @@ internal sealed class CombatController : IDisposable } } + internal unsafe bool IsInLineOfSight(IGameObject target) + { + Vector3 sourcePos = _clientState.LocalPlayer!.Position; + sourcePos.Y += 2; + + Vector3 targetPos = target.Position; + targetPos.Y += 2; + + Vector3 direction = targetPos - sourcePos; + float distance = direction.Length(); + + direction = Vector3.Normalize(direction); + + Vector3 originVect = new Vector3(sourcePos.X, sourcePos.Y, sourcePos.Z); + Vector3 directionVect = new Vector3(direction.X, direction.Y, direction.Z); + + RaycastHit hit; + var flags = stackalloc int[] { 0x4000, 0, 0x4000, 0 }; + var isLoSBlocked = + Framework.Instance()->BGCollisionModule->RaycastMaterialFilter(&hit, &originVect, &directionVect, distance, + 1, flags); + + return isLoSBlocked == false; + } + + private void UpdateLastTargetAndQuestVariables(IGameObject? target) + { + _lastTargetId = target?.GameObjectId; + _previousQuestVariables = _currentFight!.Data.ElementId != null + ? _questFunctions.GetQuestProgressInfo(_currentFight.Data.ElementId)?.Variables + : null; + /* + _logger.LogTrace("UpdateTargetData: {TargetId}; {QuestVariables}", + target?.GameObjectId.ToString("X8", CultureInfo.InvariantCulture) ?? "null", + _previousQuestVariables != null ? string.Join(", ", _previousQuestVariables) : "null"); + */ + } + public void Stop(string label) { using var scope = _logger.BeginScope(label); @@ -422,6 +498,8 @@ internal sealed class CombatController : IDisposable public sealed class CombatData { public required ElementId? ElementId { get; init; } + public required int Sequence { get; init; } + public required IList CompletionQuestVariablesFlags { get; init; } public required EEnemySpawnType SpawnType { get; init; } public required List KillEnemyDataIds { get; init; } public required List ComplexCombatDatas { get; init; } diff --git a/Questionable/Controller/MiniTaskController.cs b/Questionable/Controller/MiniTaskController.cs index 06e5d874d..6055a68c6 100644 --- a/Questionable/Controller/MiniTaskController.cs +++ b/Questionable/Controller/MiniTaskController.cs @@ -173,7 +173,7 @@ internal abstract class MiniTaskController if (_condition[ConditionFlag.Mounted]) tasks.Add(new Mount.UnmountTask()); - tasks.Add(Combat.Factory.CreateTask(null, false, EEnemySpawnType.QuestInterruption, [], [], [], null)); + tasks.Add(Combat.Factory.CreateTask(null, -1, false, EEnemySpawnType.QuestInterruption, [], [], [], null)); tasks.Add(new WaitAtEnd.WaitDelay()); _taskQueue.InterruptWith(tasks); } diff --git a/Questionable/Controller/Steps/Interactions/Combat.cs b/Questionable/Controller/Steps/Interactions/Combat.cs index a4d9594d0..463c32cec 100644 --- a/Questionable/Controller/Steps/Interactions/Combat.cs +++ b/Questionable/Controller/Steps/Interactions/Combat.cs @@ -102,17 +102,30 @@ internal static class Combat ArgumentNullException.ThrowIfNull(step.EnemySpawnType); bool isLastStep = sequence.Steps.Last() == step; - return CreateTask(quest.Id, isLastStep, step.EnemySpawnType.Value, step.KillEnemyDataIds, - step.CompletionQuestVariablesFlags, step.ComplexCombatData, step.CombatItemUse); + return CreateTask(quest.Id, + sequence.Sequence, + isLastStep, + step.EnemySpawnType.Value, + step.KillEnemyDataIds, + step.CompletionQuestVariablesFlags, + step.ComplexCombatData, + step.CombatItemUse); } - internal static Task CreateTask(ElementId? elementId, bool isLastStep, EEnemySpawnType enemySpawnType, - IList killEnemyDataIds, IList completionQuestVariablesFlags, - IList complexCombatData, CombatItemUse? combatItemUse) + internal static Task CreateTask(ElementId? elementId, + int sequence, + bool isLastStep, + EEnemySpawnType enemySpawnType, + IList killEnemyDataIds, + IList completionQuestVariablesFlags, + IList complexCombatData, + CombatItemUse? combatItemUse) { return new Task(new CombatController.CombatData { ElementId = elementId, + Sequence = sequence, + CompletionQuestVariablesFlags = completionQuestVariablesFlags, SpawnType = enemySpawnType, KillEnemyDataIds = killEnemyDataIds.ToList(), ComplexCombatDatas = complexCombatData.ToList(), From 2ffedfa72c8802421f32eae23d72944ce34abd5a Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 12 Jan 2025 02:36:17 +0100 Subject: [PATCH 104/109] Specify loop count for AD --- Questionable/External/AutoDutyIpc.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Questionable/External/AutoDutyIpc.cs b/Questionable/External/AutoDutyIpc.cs index 71bae7fd1..9d0490629 100644 --- a/Questionable/External/AutoDutyIpc.cs +++ b/Questionable/External/AutoDutyIpc.cs @@ -67,7 +67,7 @@ internal sealed class AutoDutyIpc try { - _run.InvokeAction(cfcData.TerritoryId, 0, true); + _run.InvokeAction(cfcData.TerritoryId, 1, true); } catch (IpcError e) { From 76e8ac499573dc733f30e1d7a3d339d1bacb4565 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 12 Jan 2025 02:40:09 +0100 Subject: [PATCH 105/109] Set minimum StopDistance to navmesh step size (0.25) --- .../Black Shroud/Gridania/970_Some Seedy Business.json | 2 +- QuestPaths/quest-v1.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json index 845367804..b5038e3b0 100644 --- a/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json @@ -57,7 +57,7 @@ }, "TerritoryId": 152, "InteractionType": "Interact", - "StopDistance": 0.1, + "StopDistance": 0.25, "AetheryteShortcut": "East Shroud - Hawthorne Hut", "Fly": true, "SkipConditions": { diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index d04fd82c5..99105c93c 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -80,7 +80,7 @@ "null" ], "description": "Set if pathfinding should stop closer or further away from the default stop distance", - "exclusiveMinimum": 0 + "minimum": 0.25 }, "IgnoreDistanceToObject": { "type": "boolean", From 10b8c1ddc2c4b5ace2efd6e27bd7099dcd43d96e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 12 Jan 2025 11:35:46 +0100 Subject: [PATCH 106/109] Set minimum StopDistance to navmesh step size (0.25) --- .../Black Shroud/Gridania/970_Some Seedy Business.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json index b5038e3b0..03953144b 100644 --- a/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Black Shroud/Gridania/970_Some Seedy Business.json @@ -83,7 +83,7 @@ }, "TerritoryId": 152, "InteractionType": "Interact", - "StopDistance": 0.1, + "StopDistance": 0.25, "AetheryteShortcut": "East Shroud - Hawthorne Hut", "Fly": true, "SkipConditions": { @@ -109,7 +109,7 @@ }, "TerritoryId": 152, "InteractionType": "Interact", - "StopDistance": 0.1, + "StopDistance": 0.25, "AetheryteShortcut": "East Shroud - Hawthorne Hut", "Fly": true, "SkipConditions": { From a2a36c51564120c58fe299c1a1fcebd2acb23079 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 12 Jan 2025 17:59:10 +0100 Subject: [PATCH 107/109] Version bump --- Directory.Build.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index 58a5fad2f..c0b49f3b3 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 4.13 + 4.14 From 16b62316c59ceea19d22444a46a89fe1bac760df Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 13 Jan 2025 18:38:53 +0100 Subject: [PATCH 108/109] Leave TextAdvance active if waiting for a new quest sequence from the server --- Questionable/External/TextAdvanceIpc.cs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Questionable/External/TextAdvanceIpc.cs b/Questionable/External/TextAdvanceIpc.cs index dd4fa3959..f840cc18f 100644 --- a/Questionable/External/TextAdvanceIpc.cs +++ b/Questionable/External/TextAdvanceIpc.cs @@ -22,13 +22,16 @@ internal sealed class TextAdvanceIpc : IDisposable private readonly string _pluginName; private readonly ExternalTerritoryConfig _externalTerritoryConfig = new(); - public TextAdvanceIpc(IDalamudPluginInterface pluginInterface, IFramework framework, QuestController questController, Configuration configuration) + public TextAdvanceIpc(IDalamudPluginInterface pluginInterface, IFramework framework, + QuestController questController, Configuration configuration) { _framework = framework; _questController = questController; _configuration = configuration; _isInExternalControl = pluginInterface.GetIpcSubscriber("TextAdvance.IsInExternalControl"); - _enableExternalControl = pluginInterface.GetIpcSubscriber("TextAdvance.EnableExternalControl"); + _enableExternalControl = + pluginInterface.GetIpcSubscriber( + "TextAdvance.EnableExternalControl"); _disableExternalControl = pluginInterface.GetIpcSubscriber("TextAdvance.DisableExternalControl"); _pluginName = pluginInterface.InternalName; _framework.Update += OnUpdate; @@ -37,7 +40,7 @@ internal sealed class TextAdvanceIpc : IDisposable public void Dispose() { _framework.Update -= OnUpdate; - if(_isExternalControlActivated) + if (_isExternalControlActivated) { _disableExternalControl.InvokeFunc(_pluginName); } @@ -45,11 +48,13 @@ internal sealed class TextAdvanceIpc : IDisposable private void OnUpdate(IFramework framework) { - if(_configuration.General.ConfigureTextAdvance && _questController.IsRunning) + bool hasActiveQuest = _questController.IsRunning || + _questController.AutomationType != QuestController.EAutomationType.Manual; + if (_configuration.General.ConfigureTextAdvance && hasActiveQuest) { - if(!_isInExternalControl.InvokeFunc()) + if (!_isInExternalControl.InvokeFunc()) { - if(_enableExternalControl.InvokeFunc(_pluginName, _externalTerritoryConfig)) + if (_enableExternalControl.InvokeFunc(_pluginName, _externalTerritoryConfig)) { _isExternalControlActivated = true; } @@ -57,9 +62,9 @@ internal sealed class TextAdvanceIpc : IDisposable } else { - if(_isExternalControlActivated) + if (_isExternalControlActivated) { - if(_disableExternalControl.InvokeFunc(_pluginName) || !_isInExternalControl.InvokeFunc()) + if (_disableExternalControl.InvokeFunc(_pluginName) || !_isInExternalControl.InvokeFunc()) { _isExternalControlActivated = false; } From 7734692b0fbe61f32a5ca5ec1d0b4abf5a8441c2 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 16 Jan 2025 22:55:22 +0100 Subject: [PATCH 109/109] Throw an exception if using aethernet doesn't work and the destination is in another territory --- Questionable/Controller/Steps/Shared/AethernetShortcut.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs index bfb2cc3ff..e63b69c0a 100644 --- a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs +++ b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs @@ -179,10 +179,12 @@ internal static class AethernetShortcut } } } - else + else if (clientState.TerritoryType == aetheryteData.TerritoryIds[Task.To]) logger.LogWarning( - "Aethernet shortcut not unlocked (from: {FromAetheryte}, to: {ToAetheryte}), walking manually", + "Aethernet shortcut not unlocked (from: {FromAetheryte}, to: {ToAetheryte}), skipping as we are already in the destination territory", Task.From, Task.To); + else + throw new TaskException($"Aethernet shortcut not unlocked (from: {Task.From}, to: {Task.To})"); return false; }