SwapToFreeHandOperator.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System.Threading;
  2. using System.Threading.Tasks;
  3. using Content.Server.Hands.Systems;
  4. using Content.Shared.Hands.Components;
  5. namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Interactions;
  6. /// <summary>
  7. /// Swaps to any free hand.
  8. /// </summary>
  9. public sealed partial class SwapToFreeHandOperator : HTNOperator
  10. {
  11. [Dependency] private readonly IEntityManager _entManager = default!;
  12. public override async Task<(bool Valid, Dictionary<string, object>? Effects)> Plan(NPCBlackboard blackboard, CancellationToken cancelToken)
  13. {
  14. if (!blackboard.TryGetValue<List<string>>(NPCBlackboard.FreeHands, out var hands, _entManager) ||
  15. !_entManager.TryGetComponent<HandsComponent>(blackboard.GetValue<EntityUid>(NPCBlackboard.Owner), out var handsComp))
  16. {
  17. return (false, null);
  18. }
  19. foreach (var hand in hands)
  20. {
  21. return (true, new Dictionary<string, object>()
  22. {
  23. {
  24. NPCBlackboard.ActiveHand, handsComp.Hands[hand]
  25. },
  26. {
  27. NPCBlackboard.ActiveHandFree, true
  28. },
  29. });
  30. }
  31. return (false, null);
  32. }
  33. public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime)
  34. {
  35. // TODO: Need interaction cooldown
  36. var owner = blackboard.GetValue<EntityUid>(NPCBlackboard.Owner);
  37. var handSystem = _entManager.System<HandsSystem>();
  38. if (!handSystem.TrySelectEmptyHand(owner))
  39. {
  40. return HTNOperatorStatus.Failed;
  41. }
  42. return HTNOperatorStatus.Finished;
  43. }
  44. }