using Dalamud.Plugin.Services;
using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps;
+using Questionable.External;
using Questionable.Model;
using Questionable.Model.V1;
private readonly QuestRegistry _questRegistry;
private readonly IKeyState _keyState;
private readonly Configuration _configuration;
+ private readonly YesAlreadyIpc _yesAlreadyIpc;
private readonly IReadOnlyList<ITaskFactory> _taskFactories;
private readonly object _lock = new();
QuestRegistry questRegistry,
IKeyState keyState,
Configuration configuration,
+ YesAlreadyIpc yesAlreadyIpc,
IEnumerable<ITaskFactory> taskFactories)
{
_clientState = clientState;
_questRegistry = questRegistry;
_keyState = keyState;
_configuration = configuration;
+ _yesAlreadyIpc = yesAlreadyIpc;
_taskFactories = taskFactories.ToList().AsReadOnly();
}
if (_taskQueue.Count > 0)
_taskQueue.Clear();
+
+ _movementController.Stop();
+ _yesAlreadyIpc.DisableYesAlready();
}
public void Stop(string label, bool continueIfAutomatic = false)
return
[
serviceProvider.GetRequiredService<WaitObjectAtPosition>()
- .With(step.DataId.Value, step.Position.Value),
+ .With(step.DataId.Value, step.Position.Value, step.NpcWaitDistance ?? 0.05f),
serviceProvider.GetRequiredService<WaitDelay>(),
Next(quest, sequence, step)
];
{
public uint DataId { get; set; }
public Vector3 Destination { get; set; }
+ public float Distance { get; set; }
- public ITask With(uint dataId, Vector3 destination)
+ public ITask With(uint dataId, Vector3 destination, float distance)
{
DataId = dataId;
Destination = destination;
+ Distance = distance;
return this;
}
public bool Start() => true;
public ETaskResult Update() =>
- gameFunctions.IsObjectAtPosition(DataId, Destination)
+ gameFunctions.IsObjectAtPosition(DataId, Destination, Distance)
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
--- /dev/null
+using System;
+using System.Collections.Generic;
+using Dalamud.Plugin.Services;
+using Microsoft.Extensions.DependencyInjection;
+using Questionable.External;
+using Questionable.Model;
+using Questionable.Model.V1;
+
+namespace Questionable.Controller.Steps.InteractionFactory;
+
+internal static class SinglePlayerDuty
+{
+ internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory
+ {
+ public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
+ {
+ if (step.InteractionType != EInteractionType.SinglePlayerDuty)
+ return [];
+
+ ArgumentNullException.ThrowIfNull(step.DataId);
+ return
+ [
+ serviceProvider.GetRequiredService<DisableYesAlready>(),
+ serviceProvider.GetRequiredService<Interact.DoInteract>()
+ .With(step.DataId.Value, true),
+ serviceProvider.GetRequiredService<RestoreYesAlready>()
+ ];
+ }
+
+ public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
+ => throw new InvalidOperationException();
+ }
+
+ internal sealed class DisableYesAlready(YesAlreadyIpc yesAlreadyIpc) : ITask
+ {
+ public bool Start()
+ {
+ yesAlreadyIpc.DisableYesAlready();
+ return true;
+ }
+
+ public ETaskResult Update() => ETaskResult.TaskComplete;
+
+ public override string ToString() => "DisableYA";
+ }
+
+ internal sealed class RestoreYesAlready(YesAlreadyIpc yesAlreadyIpc, IGameGui gameGui) : ITask
+ {
+ public bool Start() => true;
+
+ public ETaskResult Update()
+ {
+ if (gameGui.GetAddonByName("SelectYesno") != nint.Zero ||
+ gameGui.GetAddonByName("DifficultySelectYesNo") != nint.Zero)
+ return ETaskResult.StillRunning;
+
+ yesAlreadyIpc.RestoreYesAlready();
+ return ETaskResult.TaskComplete;
+ }
+
+ public override string ToString() => "Wait(DialogClosed) → RestoreYA";
+ }
+}
--- /dev/null
+using System;
+using System.Collections.Generic;
+using Dalamud.Plugin;
+using Dalamud.Plugin.Services;
+
+namespace Questionable.External;
+
+internal sealed class YesAlreadyIpc : IDisposable
+{
+ private readonly DalamudPluginInterface _pluginInterface;
+ private readonly IPluginLog _pluginLog;
+
+ public YesAlreadyIpc(DalamudPluginInterface pluginInterface, IPluginLog pluginLog)
+ {
+ _pluginInterface = pluginInterface;
+ _pluginLog = pluginLog;
+ }
+
+ public void DisableYesAlready()
+ {
+ _pluginLog.Debug("Disabling YesAlready");
+ if (_pluginInterface.TryGetData<HashSet<string>>("YesAlready.StopRequests", out var data))
+ data.Add(nameof(Questionable));
+ }
+
+ public void RestoreYesAlready()
+ {
+ _pluginLog.Debug("Restoring YesAlready");
+ if (_pluginInterface.TryGetData<HashSet<string>>("YesAlready.StopRequests", out var data))
+ data.Remove(nameof(Questionable));
+ }
+
+ public void Dispose() => RestoreYesAlready();
+}
serviceCollection.AddSingleton<TerritoryData>();
serviceCollection.AddSingleton<NavmeshIpc>();
serviceCollection.AddSingleton<LifestreamIpc>();
+ serviceCollection.AddSingleton<YesAlreadyIpc>();
// individual tasks
serviceCollection.AddTransient<MountTask>();
serviceCollection.AddTaskWithFactory<Say.Factory, Say.UseChat>();
serviceCollection.AddTaskWithFactory<UseItem.Factory, UseItem.UseOnGround, UseItem.UseOnObject, UseItem.Use>();
serviceCollection.AddTaskWithFactory<EquipItem.Factory, EquipItem.DoEquip>();
+ serviceCollection.AddTaskWithFactory<SinglePlayerDuty.Factory, SinglePlayerDuty.DisableYesAlready, SinglePlayerDuty.RestoreYesAlready>();
serviceCollection
.AddTaskWithFactory<WaitAtEnd.Factory,