Fix some Shaaloani/S9 pathing issues

This commit is contained in:
Liza 2024-09-20 16:05:39 +02:00
parent d3e0bba06c
commit e54732e798
Signed by: liza
GPG Key ID: 7199F8D727D55F67
8 changed files with 101 additions and 13 deletions

View File

@ -59,7 +59,8 @@
}, },
"TerritoryId": 1190, "TerritoryId": 1190,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"$": "Shaaloani Hhusatahwi Saloon Stairs (top)" "$": "Shaaloani Hhusatahwi Saloon Stairs (top)",
"Mount": true
}, },
{ {
"Position": { "Position": {

View File

@ -137,6 +137,15 @@
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [
{
"Position": {
"X": -163.63573,
"Y": 45.171337,
"Z": 12.003954
},
"TerritoryId": 1185,
"InteractionType": "WalkTo"
},
{ {
"DataId": 1047026, "DataId": 1047026,
"Position": { "Position": {

View File

@ -55,7 +55,8 @@
"Z": 0.6866455 "Z": 0.6866455
}, },
"TerritoryId": 1171, "TerritoryId": 1171,
"InteractionType": "Interact" "InteractionType": "Interact",
"DelaySecondsAtStart": 3
} }
] ]
}, },

View File

@ -44,12 +44,14 @@
"Z": -117.162285 "Z": -117.162285
}, },
"TerritoryId": 1186, "TerritoryId": 1186,
"InteractionType": "WalkTo" "InteractionType": "WalkTo",
"RestartNavigationIfCancelled": false
}, },
{ {
"TerritoryId": 1186, "TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard", "InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Solution Nine] Resolution" "AethernetShard": "[Solution Nine] Resolution",
"DelaySecondsAtStart": 2
}, },
{ {
"DataId": 1048073, "DataId": 1048073,

View File

@ -27,7 +27,8 @@
"Z": 5.1162424 "Z": 5.1162424
}, },
"TerritoryId": 1186, "TerritoryId": 1186,
"InteractionType": "WalkTo" "InteractionType": "WalkTo",
"RestartNavigationIfCancelled": false
}, },
{ {
"DataId": 1048172, "DataId": 1048172,
@ -37,7 +38,8 @@
"Z": 9.201172 "Z": 9.201172
}, },
"TerritoryId": 1186, "TerritoryId": 1186,
"InteractionType": "Interact" "InteractionType": "Interact",
"DelaySecondsAtStart": 2
} }
] ]
}, },

View File

@ -19,7 +19,11 @@ namespace Questionable.Controller.Steps.Shared;
internal static class AethernetShortcut internal static class AethernetShortcut
{ {
internal sealed class Factory(MovementController movementController) internal sealed class Factory(
MovementController movementController,
AetheryteData aetheryteData,
TerritoryData territoryData,
IClientState clientState)
: ITaskFactory : ITaskFactory
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
@ -31,6 +35,14 @@ internal static class AethernetShortcut
"Wait(navmesh ready)"); "Wait(navmesh ready)");
yield return new Task(step.AethernetShortcut.From, step.AethernetShortcut.To, yield return new Task(step.AethernetShortcut.From, step.AethernetShortcut.To,
step.SkipConditions?.AethernetShortcutIf ?? new()); step.SkipConditions?.AethernetShortcutIf ?? new());
if (AetheryteShortcut.MoveAwayFromAetheryteExecutor.AppliesTo(step.AethernetShortcut.To))
{
yield return new WaitCondition.Task(
() => clientState.TerritoryType == aetheryteData.TerritoryIds[step.AethernetShortcut.To],
$"Wait(territory: {territoryData.GetNameAndId(aetheryteData.TerritoryIds[step.AethernetShortcut.To])})");
yield return new AetheryteShortcut.MoveAwayFromAetheryte(step.AethernetShortcut.To);
}
} }
} }
@ -142,7 +154,7 @@ internal static class AethernetShortcut
new(0, 8.442986f, -9), new(0, 8.442986f, -9),
]; ];
Vector3 closestPoint = nearbyPoints.MinBy(x => (playerPosition - x).Length()); Vector3 closestPoint = nearbyPoints.MinBy(x => Vector3.Distance(playerPosition, x));
_moving = true; _moving = true;
movementController.NavigateTo(EMovementType.Quest, (uint)Task.From, closestPoint, false, true, movementController.NavigateTo(EMovementType.Quest, (uint)Task.From, closestPoint, false, true,
0.25f); 0.25f);

View File

@ -1,9 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Common;
using Questionable.Controller.Utils; using Questionable.Controller.Utils;
using Questionable.Data; using Questionable.Data;
using Questionable.Functions; using Questionable.Functions;
@ -15,7 +17,8 @@ namespace Questionable.Controller.Steps.Shared;
internal static class AetheryteShortcut internal static class AetheryteShortcut
{ {
internal sealed class Factory(AetheryteData aetheryteData) : ITaskFactory internal sealed class Factory(AetheryteData aetheryteData, TerritoryData territoryData, IClientState clientState)
: ITaskFactory
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{ {
@ -25,6 +28,15 @@ internal static class AetheryteShortcut
yield return new Task(step, quest.Id, step.AetheryteShortcut.Value, yield return new Task(step, quest.Id, step.AetheryteShortcut.Value,
aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]); aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]);
yield return new WaitAtEnd.WaitDelay(TimeSpan.FromSeconds(0.5)); yield return new WaitAtEnd.WaitDelay(TimeSpan.FromSeconds(0.5));
if (MoveAwayFromAetheryteExecutor.AppliesTo(step.AetheryteShortcut.Value) &&
step.AethernetShortcut?.From != step.AetheryteShortcut.Value)
{
yield return new WaitCondition.Task(
() => clientState.TerritoryType == aetheryteData.TerritoryIds[step.AetheryteShortcut.Value],
$"Wait(territory: {territoryData.GetNameAndId(aetheryteData.TerritoryIds[step.AetheryteShortcut.Value])})");
yield return new MoveAwayFromAetheryte(step.AetheryteShortcut.Value);
}
} }
} }
@ -206,4 +218,47 @@ internal static class AetheryteShortcut
} }
} }
} }
internal sealed record MoveAwayFromAetheryte(EAetheryteLocation TargetAetheryte) : ITask
{
public override string ToString() => $"MoveAway({TargetAetheryte})";
}
internal sealed class MoveAwayFromAetheryteExecutor(
MoveTo.MoveExecutor moveExecutor,
AetheryteData aetheryteData,
IClientState clientState) : TaskExecutor<MoveAwayFromAetheryte>
{
private static readonly Dictionary<EAetheryteLocation, List<Vector3>> AetherytesToMoveFrom = new()
{
{
EAetheryteLocation.SolutionNine,
[
new(0f, 8.8f, 15.5f),
new(0f, 8.8f, -15.5f),
new(15.5f, 8.8f, 0f),
new(-15.5f, 8.8f, 0f)
]
}
};
public static bool AppliesTo(EAetheryteLocation location) => AetherytesToMoveFrom.ContainsKey(location);
protected override bool Start()
{
// only relevant if we're actually near the s9 aetheryte at the end
Vector3 playerPosition = clientState.LocalPlayer!.Position;
if (aetheryteData.CalculateDistance(playerPosition, clientState.TerritoryType, Task.TargetAetheryte) >= 20)
return false;
Vector3 closestPoint = AetherytesToMoveFrom[Task.TargetAetheryte]
.MinBy(x => Vector3.Distance(x, playerPosition));
MoveTo.MoveTask task = new MoveTo.MoveTask(aetheryteData.TerritoryIds[Task.TargetAetheryte],
closestPoint, Mount: false, StopDistance: 0.25f, DisableNavmesh: true,
InteractionType: EInteractionType.None, RestartNavigation: false);
return moveExecutor.Start(task);
}
public override ETaskResult Update() => moveExecutor.Update();
}
} }

View File

@ -129,7 +129,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
private static void AddTaskFactories(ServiceCollection serviceCollection) private static void AddTaskFactories(ServiceCollection serviceCollection)
{ {
// individual tasks // individual tasks
serviceCollection.AddTaskExecutor<MoveToLandingLocation.Task, MoveToLandingLocation.MoveToLandingLocationExecutor>(); serviceCollection
.AddTaskExecutor<MoveToLandingLocation.Task, MoveToLandingLocation.MoveToLandingLocationExecutor>();
serviceCollection.AddTaskExecutor<DoGather.Task, DoGather.GatherExecutor>(); serviceCollection.AddTaskExecutor<DoGather.Task, DoGather.GatherExecutor>();
serviceCollection.AddTaskExecutor<DoGatherCollectable.Task, DoGatherCollectable.GatherCollectableExecutor>(); serviceCollection.AddTaskExecutor<DoGatherCollectable.Task, DoGatherCollectable.GatherCollectableExecutor>();
serviceCollection.AddTaskExecutor<SwitchClassJob.Task, SwitchClassJob.SwitchClassJobExecutor>(); serviceCollection.AddTaskExecutor<SwitchClassJob.Task, SwitchClassJob.SwitchClassJobExecutor>();
@ -138,13 +139,16 @@ public sealed class QuestionablePlugin : IDalamudPlugin
// task factories // task factories
serviceCollection serviceCollection
.AddTaskFactoryAndExecutor<StepDisabled.SkipRemainingTasks, StepDisabled.Factory, StepDisabled.SkipDisabledStepsExecutor>(); .AddTaskFactoryAndExecutor<StepDisabled.SkipRemainingTasks, StepDisabled.Factory,
StepDisabled.SkipDisabledStepsExecutor>();
serviceCollection.AddTaskFactory<EquipRecommended.BeforeDutyOrInstance>(); serviceCollection.AddTaskFactory<EquipRecommended.BeforeDutyOrInstance>();
serviceCollection.AddTaskFactoryAndExecutor<Gather.GatheringTask, Gather.Factory, Gather.StartGathering>(); serviceCollection.AddTaskFactoryAndExecutor<Gather.GatheringTask, Gather.Factory, Gather.StartGathering>();
serviceCollection.AddTaskExecutor<Gather.SkipMarker, Gather.DoSkip>(); serviceCollection.AddTaskExecutor<Gather.SkipMarker, Gather.DoSkip>();
serviceCollection serviceCollection
.AddTaskFactoryAndExecutor<AetheryteShortcut.Task, AetheryteShortcut.Factory, .AddTaskFactoryAndExecutor<AetheryteShortcut.Task, AetheryteShortcut.Factory,
AetheryteShortcut.UseAetheryteShortcut>(); AetheryteShortcut.UseAetheryteShortcut>();
serviceCollection
.AddTaskExecutor<AetheryteShortcut.MoveAwayFromAetheryte, AetheryteShortcut.MoveAwayFromAetheryteExecutor>();
serviceCollection serviceCollection
.AddTaskFactoryAndExecutor<SkipCondition.SkipTask, SkipCondition.Factory, SkipCondition.CheckSkip>(); .AddTaskFactoryAndExecutor<SkipCondition.SkipTask, SkipCondition.Factory, SkipCondition.CheckSkip>();
serviceCollection serviceCollection
@ -156,7 +160,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddTaskExecutor<MoveTo.WaitForNearDataId, MoveTo.WaitForNearDataIdExecutor>(); serviceCollection.AddTaskExecutor<MoveTo.WaitForNearDataId, MoveTo.WaitForNearDataIdExecutor>();
serviceCollection.AddTaskExecutor<MoveTo.LandTask, MoveTo.LandExecutor>(); serviceCollection.AddTaskExecutor<MoveTo.LandTask, MoveTo.LandExecutor>();
serviceCollection.AddTaskFactoryAndExecutor<NextQuest.SetQuestTask, NextQuest.Factory, NextQuest.NextQuestExecutor>(); serviceCollection
.AddTaskFactoryAndExecutor<NextQuest.SetQuestTask, NextQuest.Factory, NextQuest.NextQuestExecutor>();
serviceCollection serviceCollection
.AddTaskFactoryAndExecutor<AetherCurrent.Attune, AetherCurrent.Factory, AetherCurrent.DoAttune>(); .AddTaskFactoryAndExecutor<AetherCurrent.Attune, AetherCurrent.Factory, AetherCurrent.DoAttune>();
serviceCollection serviceCollection
@ -189,7 +194,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
TurnInDelivery.SatisfactionSupplyTurnIn>(); TurnInDelivery.SatisfactionSupplyTurnIn>();
serviceCollection.AddTaskFactory<InitiateLeve.Factory>(); serviceCollection.AddTaskFactory<InitiateLeve.Factory>();
serviceCollection.AddTaskExecutor<InitiateLeve.SkipInitiateIfActive, InitiateLeve.SkipInitiateIfActiveExecutor>(); serviceCollection
.AddTaskExecutor<InitiateLeve.SkipInitiateIfActive, InitiateLeve.SkipInitiateIfActiveExecutor>();
serviceCollection.AddTaskExecutor<InitiateLeve.OpenJournal, InitiateLeve.OpenJournalExecutor>(); serviceCollection.AddTaskExecutor<InitiateLeve.OpenJournal, InitiateLeve.OpenJournalExecutor>();
serviceCollection.AddTaskExecutor<InitiateLeve.Initiate, InitiateLeve.InitiateExecutor>(); serviceCollection.AddTaskExecutor<InitiateLeve.Initiate, InitiateLeve.InitiateExecutor>();
serviceCollection.AddTaskExecutor<InitiateLeve.SelectDifficulty, InitiateLeve.SelectDifficultyExecutor>(); serviceCollection.AddTaskExecutor<InitiateLeve.SelectDifficulty, InitiateLeve.SelectDifficultyExecutor>();