From 977eadfb13d751caeb07fccc6c7664b95e6e44df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 21 Jan 2023 13:11:45 +0100 Subject: [PATCH] feat(combat): allow cancelling operations --- .../Operations/CompoundOperation.cs | 21 ++++++++++++---- .../Operations/UseItemOperation.cs | 24 +++++++++++++++---- .../Operations/WalkInRangeOperation.cs | 20 +++++++++++++--- .../Operations/WalkOperation.cs | 20 +++++++++++++--- 4 files changed, 70 insertions(+), 15 deletions(-) diff --git a/Extensions/NosSmooth.Extensions.Combat/Operations/CompoundOperation.cs b/Extensions/NosSmooth.Extensions.Combat/Operations/CompoundOperation.cs index eeb97b7..af73761 100644 --- a/Extensions/NosSmooth.Extensions.Combat/Operations/CompoundOperation.cs +++ b/Extensions/NosSmooth.Extensions.Combat/Operations/CompoundOperation.cs @@ -19,6 +19,7 @@ public class CompoundOperation : ICombatOperation private readonly ICombatTechnique _technique; private readonly ICombatOperation[] _operations; private readonly OperationQueueType _queueType; + private CancellationTokenSource? _ct; private Task? _compoundOperation; /// @@ -50,7 +51,7 @@ public class CompoundOperation : ICombatOperation } /// - public OperationQueueType QueueType { get; } + public OperationQueueType QueueType => _queueType; /// public Task BeginExecution(ICombatState combatState, CancellationToken ct = default) @@ -60,10 +61,11 @@ public class CompoundOperation : ICombatOperation return Task.FromResult(Result.FromSuccess()); } + _ct = new CancellationTokenSource(); _compoundOperation = Task.Run ( - () => UseAsync(combatState, ct), - ct + () => UseAsync(combatState, _ct.Token), + _ct.Token ); return Task.FromResult(Result.FromSuccess()); } @@ -82,7 +84,18 @@ public class CompoundOperation : ICombatOperation throw new UnreachableException(); } - return await _compoundOperation; + try + { + return await _compoundOperation; + } + catch (OperationCanceledException) + { + return Result.FromSuccess(); + } + catch (Exception e) + { + return e; + } } /// diff --git a/Extensions/NosSmooth.Extensions.Combat/Operations/UseItemOperation.cs b/Extensions/NosSmooth.Extensions.Combat/Operations/UseItemOperation.cs index 6d87c12..449e4c2 100644 --- a/Extensions/NosSmooth.Extensions.Combat/Operations/UseItemOperation.cs +++ b/Extensions/NosSmooth.Extensions.Combat/Operations/UseItemOperation.cs @@ -21,6 +21,7 @@ namespace NosSmooth.Extensions.Combat.Operations; public record UseItemOperation(InventoryItem Item) : ICombatOperation { private Task? _useItemOperation; + private CancellationTokenSource? _ct; /// public OperationQueueType QueueType => OperationQueueType.Item; @@ -33,19 +34,20 @@ public record UseItemOperation(InventoryItem Item) : ICombatOperation return Task.FromResult(Result.FromSuccess()); } + _ct = new CancellationTokenSource(); _useItemOperation = Task.Run( - () => combatState.Client.SendPacketAsync(new UseItemPacket(Item.Bag.Convert(), Item.Item.Slot), ct), - ct + () => combatState.Client.SendPacketAsync(new UseItemPacket(Item.Bag.Convert(), Item.Item.Slot), _ct.Token), + _ct.Token ); return Task.FromResult(Result.FromSuccess()); } /// - public Task WaitForFinishedAsync(ICombatState combatState, CancellationToken ct = default) + public async Task WaitForFinishedAsync(ICombatState combatState, CancellationToken ct = default) { if (IsFinished()) { - return Task.FromResult(Result.FromSuccess()); + return Result.FromSuccess(); } BeginExecution(combatState, ct); @@ -54,7 +56,18 @@ public record UseItemOperation(InventoryItem Item) : ICombatOperation throw new UnreachableException(); } - return _useItemOperation; + try + { + return await _useItemOperation; + } + catch (OperationCanceledException) + { + return Result.FromSuccess(); + } + catch (Exception e) + { + return e; + } } /// @@ -72,6 +85,7 @@ public record UseItemOperation(InventoryItem Item) : ICombatOperation /// public void Dispose() { + _ct?.Cancel(); _useItemOperation?.Dispose(); } } \ No newline at end of file diff --git a/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs b/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs index 7162ad2..36b0b61 100644 --- a/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs +++ b/Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs @@ -30,6 +30,7 @@ public record WalkInRangeOperation ) : ICombatOperation { private Task? _walkInRangeOperation; + private CancellationTokenSource? _ct; /// public OperationQueueType QueueType => OperationQueueType.TotalControl; @@ -42,10 +43,11 @@ public record WalkInRangeOperation return Task.FromResult(Result.FromSuccess()); } + _ct = new CancellationTokenSource(); _walkInRangeOperation = Task.Run ( - () => UseAsync(combatState, ct), - ct + () => UseAsync(combatState, _ct.Token), + _ct.Token ); return Task.FromResult(Result.FromSuccess()); } @@ -64,7 +66,18 @@ public record WalkInRangeOperation throw new UnreachableException(); } - return await _walkInRangeOperation; + try + { + return await _walkInRangeOperation; + } + catch (OperationCanceledException) + { + return Result.FromSuccess(); + } + catch (Exception e) + { + return e; + } } /// @@ -186,6 +199,7 @@ public record WalkInRangeOperation /// public void Dispose() { + _ct?.Cancel(); _walkInRangeOperation?.Dispose(); } } \ No newline at end of file diff --git a/Extensions/NosSmooth.Extensions.Combat/Operations/WalkOperation.cs b/Extensions/NosSmooth.Extensions.Combat/Operations/WalkOperation.cs index 3461d60..0797e67 100644 --- a/Extensions/NosSmooth.Extensions.Combat/Operations/WalkOperation.cs +++ b/Extensions/NosSmooth.Extensions.Combat/Operations/WalkOperation.cs @@ -20,6 +20,7 @@ namespace NosSmooth.Extensions.Combat.Operations; public record WalkOperation(WalkManager WalkManager, short X, short Y) : ICombatOperation { private Task? _walkOperation; + private CancellationTokenSource? _ct; /// public OperationQueueType QueueType => OperationQueueType.TotalControl; @@ -32,10 +33,11 @@ public record WalkOperation(WalkManager WalkManager, short X, short Y) : ICombat return Task.FromResult(Result.FromSuccess()); } + _ct = new CancellationTokenSource(); _walkOperation = Task.Run ( - () => UseAsync(combatState, ct), - ct + () => UseAsync(combatState, _ct.Token), + _ct.Token ); return Task.FromResult(Result.FromSuccess()); } @@ -54,7 +56,18 @@ public record WalkOperation(WalkManager WalkManager, short X, short Y) : ICombat throw new UnreachableException(); } - return await _walkOperation; + try + { + return await _walkOperation; + } + catch (OperationCanceledException) + { + return Result.FromSuccess(); + } + catch (Exception e) + { + return e; + } } /// @@ -88,6 +101,7 @@ public record WalkOperation(WalkManager WalkManager, short X, short Y) : ICombat /// public void Dispose() { + _ct?.Cancel(); _walkOperation?.Dispose(); } } \ No newline at end of file -- 2.49.0