M Extensions/NosSmooth.Extensions.Combat/Operations/CompoundOperation.cs => Extensions/NosSmooth.Extensions.Combat/Operations/CompoundOperation.cs +17 -4
@@ 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<Result>? _compoundOperation;
/// <summary>
@@ 50,7 51,7 @@ public class CompoundOperation : ICombatOperation
}
/// <inheritdoc />
- public OperationQueueType QueueType { get; }
+ public OperationQueueType QueueType => _queueType;
/// <inheritdoc />
public Task<Result> 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;
+ }
}
/// <inheritdoc />
M Extensions/NosSmooth.Extensions.Combat/Operations/UseItemOperation.cs => Extensions/NosSmooth.Extensions.Combat/Operations/UseItemOperation.cs +19 -5
@@ 21,6 21,7 @@ namespace NosSmooth.Extensions.Combat.Operations;
public record UseItemOperation(InventoryItem Item) : ICombatOperation
{
private Task<Result>? _useItemOperation;
+ private CancellationTokenSource? _ct;
/// <inheritdoc />
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());
}
/// <inheritdoc />
- public Task<Result> WaitForFinishedAsync(ICombatState combatState, CancellationToken ct = default)
+ public async Task<Result> 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;
+ }
}
/// <inheritdoc />
@@ 72,6 85,7 @@ public record UseItemOperation(InventoryItem Item) : ICombatOperation
/// <inheritdoc />
public void Dispose()
{
+ _ct?.Cancel();
_useItemOperation?.Dispose();
}
}=
\ No newline at end of file
M Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs => Extensions/NosSmooth.Extensions.Combat/Operations/WalkInRangeOperation.cs +17 -3
@@ 30,6 30,7 @@ public record WalkInRangeOperation
) : ICombatOperation
{
private Task<Result>? _walkInRangeOperation;
+ private CancellationTokenSource? _ct;
/// <inheritdoc />
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;
+ }
}
/// <inheritdoc />
@@ 186,6 199,7 @@ public record WalkInRangeOperation
/// <inheritdoc />
public void Dispose()
{
+ _ct?.Cancel();
_walkInRangeOperation?.Dispose();
}
}=
\ No newline at end of file
M Extensions/NosSmooth.Extensions.Combat/Operations/WalkOperation.cs => Extensions/NosSmooth.Extensions.Combat/Operations/WalkOperation.cs +17 -3
@@ 20,6 20,7 @@ namespace NosSmooth.Extensions.Combat.Operations;
public record WalkOperation(WalkManager WalkManager, short X, short Y) : ICombatOperation
{
private Task<Result>? _walkOperation;
+ private CancellationTokenSource? _ct;
/// <inheritdoc />
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;
+ }
}
/// <inheritdoc />
@@ 88,6 101,7 @@ public record WalkOperation(WalkManager WalkManager, short X, short Y) : ICombat
/// <inheritdoc />
public void Dispose()
{
+ _ct?.Cancel();
_walkOperation?.Dispose();
}
}=
\ No newline at end of file