~ruther/NosSmooth

977eadfb13d751caeb07fccc6c7664b95e6e44df — František Boháček 2 years ago aa41cfe
feat(combat): allow cancelling operations
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

Do not follow this link