using System.Threading; using System.Threading.Tasks; using Content.Server.Hands.Systems; using Content.Shared.Hands.Components; namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Interactions; /// /// Swaps to any free hand. /// public sealed partial class SwapToFreeHandOperator : HTNOperator { [Dependency] private readonly IEntityManager _entManager = default!; public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard, CancellationToken cancelToken) { if (!blackboard.TryGetValue>(NPCBlackboard.FreeHands, out var hands, _entManager) || !_entManager.TryGetComponent(blackboard.GetValue(NPCBlackboard.Owner), out var handsComp)) { return (false, null); } foreach (var hand in hands) { return (true, new Dictionary() { { NPCBlackboard.ActiveHand, handsComp.Hands[hand] }, { NPCBlackboard.ActiveHandFree, true }, }); } return (false, null); } public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) { // TODO: Need interaction cooldown var owner = blackboard.GetValue(NPCBlackboard.Owner); var handSystem = _entManager.System(); if (!handSystem.TrySelectEmptyHand(owner)) { return HTNOperatorStatus.Failed; } return HTNOperatorStatus.Finished; } }