// // UseItemOperation.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System.Diagnostics; using NosSmooth.Data.Abstractions.Enums; using NosSmooth.Extensions.Combat.Selectors; using NosSmooth.Game.Data.Inventory; using NosSmooth.Game.Extensions; using NosSmooth.Packets.Client.Inventory; using Remora.Results; namespace NosSmooth.Extensions.Combat.Operations; /// /// A combat operation to use an item. /// /// The item to use. public record UseItemOperation(InventoryItem Item) : ICombatOperation { private Task? _useItemOperation; /// public OperationQueueType QueueType => OperationQueueType.Item; /// public Task BeginExecution(ICombatState combatState, CancellationToken ct = default) { if (_useItemOperation is not null) { return Task.FromResult(Result.FromSuccess()); } _useItemOperation = Task.Run( () => combatState.Client.SendPacketAsync(new UseItemPacket(Item.Bag.Convert(), Item.Item.Slot), ct), ct ); return Task.FromResult(Result.FromSuccess()); } /// public Task WaitForFinishedAsync(ICombatState combatState, CancellationToken ct = default) { if (IsFinished()) { return Task.FromResult(Result.FromSuccess()); } BeginExecution(combatState, ct); if (_useItemOperation is null) { throw new UnreachableException(); } return _useItemOperation; } /// public bool IsExecuting() => _useItemOperation is not null && !IsFinished(); /// public bool IsFinished() => _useItemOperation?.IsCompleted ?? false; /// public Result CanBeUsed(ICombatState combatState) => CanBeUsedResponse.CanBeUsed; /// public void Dispose() { _useItemOperation?.Dispose(); } }