diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index def1c297a..331b1d61e 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -473,6 +473,9 @@ internal sealed class QuestController : MiniTaskController private void ClearTasksInternal() { //_logger.LogDebug("Clearing task (internally)"); + if (_taskQueue.CurrentTaskExecutor is IStoppableTaskExecutor stoppableTaskExecutor) + stoppableTaskExecutor.StopNow(); + _taskQueue.Reset(); _yesAlreadyIpc.RestoreYesAlready(); diff --git a/Questionable/Controller/Steps/Interactions/Duty.cs b/Questionable/Controller/Steps/Interactions/Duty.cs index b59f8ce70..f40c4671d 100644 --- a/Questionable/Controller/Steps/Interactions/Duty.cs +++ b/Questionable/Controller/Steps/Interactions/Duty.cs @@ -49,7 +49,7 @@ internal static class Duty TerritoryData territoryData, IClientState clientState, IChatGui chatGui, - SendNotification.Executor sendNotificationExecutor) : TaskExecutor + SendNotification.Executor sendNotificationExecutor) : TaskExecutor, IStoppableTaskExecutor { protected override bool Start() { @@ -94,6 +94,8 @@ internal static class Duty : ETaskResult.StillRunning; } + public void StopNow() => autoDutyIpc.Stop(); + public override bool ShouldInterruptOnDamage() => false; } @@ -105,7 +107,7 @@ internal static class Duty internal sealed class WaitAutoDutyExecutor( AutoDutyIpc autoDutyIpc, TerritoryData territoryData, - IClientState clientState) : TaskExecutor + IClientState clientState) : TaskExecutor, IStoppableTaskExecutor { protected override bool Start() => true; @@ -120,6 +122,8 @@ internal static class Duty : ETaskResult.StillRunning; } + public void StopNow() => autoDutyIpc.Stop(); + public override bool ShouldInterruptOnDamage() => false; } diff --git a/Questionable/Controller/Steps/TaskExecutor.cs b/Questionable/Controller/Steps/TaskExecutor.cs index 30e10b643..d96dce2f9 100644 --- a/Questionable/Controller/Steps/TaskExecutor.cs +++ b/Questionable/Controller/Steps/TaskExecutor.cs @@ -25,6 +25,11 @@ internal interface IExtraTaskCreator : ITaskExecutor IEnumerable CreateExtraTasks(); } +internal interface IStoppableTaskExecutor : ITaskExecutor +{ + void StopNow(); +} + internal abstract class TaskExecutor : ITaskExecutor where T : class, ITask {