diff --git a/Directory.Build.targets b/Directory.Build.targets
index 939fb575a..590411dd5 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -1,5 +1,5 @@
- 3.8
+ 3.9
diff --git a/Questionable/Configuration.cs b/Questionable/Configuration.cs
index 3ea014cb8..f2a251640 100644
--- a/Questionable/Configuration.cs
+++ b/Questionable/Configuration.cs
@@ -20,6 +20,7 @@ internal sealed class Configuration : IPluginConfiguration
public bool UseEscToCancelQuesting { get; set; } = true;
public bool ShowIncompleteSeasonalEvents { get; set; } = true;
public bool AutomaticallyCompleteSnipeTasks { get; set; }
+ public bool ConfigureTextAdvance { get; set; } = true;
}
internal sealed class AdvancedConfiguration
diff --git a/Questionable/External/TextAdvanceIpc.cs b/Questionable/External/TextAdvanceIpc.cs
new file mode 100644
index 000000000..dd4fa3959
--- /dev/null
+++ b/Questionable/External/TextAdvanceIpc.cs
@@ -0,0 +1,85 @@
+using Dalamud.Plugin;
+using Dalamud.Plugin.Ipc;
+using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game;
+using Questionable.Controller;
+using Questionable.Data;
+using Questionable.Model.Common;
+using System;
+using System.Diagnostics.CodeAnalysis;
+
+namespace Questionable.External;
+
+internal sealed class TextAdvanceIpc : IDisposable
+{
+ private bool _isExternalControlActivated;
+ private readonly QuestController _questController;
+ private readonly Configuration _configuration;
+ private readonly IFramework _framework;
+ private readonly ICallGateSubscriber _isInExternalControl;
+ private readonly ICallGateSubscriber _enableExternalControl;
+ private readonly ICallGateSubscriber _disableExternalControl;
+ private readonly string _pluginName;
+ private readonly ExternalTerritoryConfig _externalTerritoryConfig = new();
+
+ 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");
+ _disableExternalControl = pluginInterface.GetIpcSubscriber("TextAdvance.DisableExternalControl");
+ _pluginName = pluginInterface.InternalName;
+ _framework.Update += OnUpdate;
+ }
+
+ public void Dispose()
+ {
+ _framework.Update -= OnUpdate;
+ if(_isExternalControlActivated)
+ {
+ _disableExternalControl.InvokeFunc(_pluginName);
+ }
+ }
+
+ private void OnUpdate(IFramework framework)
+ {
+ if(_configuration.General.ConfigureTextAdvance && _questController.IsRunning)
+ {
+ if(!_isInExternalControl.InvokeFunc())
+ {
+ if(_enableExternalControl.InvokeFunc(_pluginName, _externalTerritoryConfig))
+ {
+ _isExternalControlActivated = true;
+ }
+ }
+ }
+ else
+ {
+ if(_isExternalControlActivated)
+ {
+ if(_disableExternalControl.InvokeFunc(_pluginName) || !_isInExternalControl.InvokeFunc())
+ {
+ _isExternalControlActivated = false;
+ }
+ }
+ }
+ }
+
+ [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")]
+ public sealed class ExternalTerritoryConfig
+ {
+#pragma warning disable CS0414 // Field is assigned but its value is never used
+ public bool? EnableQuestAccept = true;
+ public bool? EnableQuestComplete = true;
+ public bool? EnableRewardPick = true;
+ public bool? EnableRequestHandin = true;
+ public bool? EnableCutsceneEsc = true;
+ public bool? EnableCutsceneSkipConfirm = true;
+ public bool? EnableTalkSkip = true;
+ public bool? EnableRequestFill = true;
+ public bool? EnableAutoInteract = false;
+#pragma warning restore CS0414 // Field is assigned but its value is never used
+ }
+}
diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs
index a3731ed49..b9a1c54eb 100644
--- a/Questionable/QuestionablePlugin.cs
+++ b/Questionable/QuestionablePlugin.cs
@@ -124,6 +124,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
}
private static void AddTaskFactories(ServiceCollection serviceCollection)
@@ -289,6 +290,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceProvider.GetRequiredService();
serviceProvider.GetRequiredService();
serviceProvider.GetRequiredService().Enable();
+ serviceProvider.GetRequiredService();
}
public void Dispose()
diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs
index 0b278c04b..0416943f7 100644
--- a/Questionable/Windows/ConfigWindow.cs
+++ b/Questionable/Windows/ConfigWindow.cs
@@ -90,6 +90,13 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
Save();
}
+ bool configureTextAdvance = _configuration.General.ConfigureTextAdvance;
+ if (ImGui.Checkbox("Automatically configure TextAdvance with the recommended settings", ref configureTextAdvance))
+ {
+ _configuration.General.ConfigureTextAdvance = configureTextAdvance;
+ Save();
+ }
+
if (ImGui.CollapsingHeader("Cheats"))
{
ImGui.TextColored(ImGuiColors.DalamudRed, "This setting will be removed in a future version, and will be\navailable through TextAdvance instead.");