AltInteractOperator.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System.Linq;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using Content.Shared.DoAfter;
  5. using Content.Shared.Interaction;
  6. namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Interactions;
  7. public sealed partial class AltInteractOperator : HTNOperator
  8. {
  9. [Dependency] private readonly IEntityManager _entManager = default!;
  10. [DataField("targetKey")]
  11. public string Key = "Target";
  12. /// <summary>
  13. /// If this alt-interaction started a do_after where does the key get stored.
  14. /// </summary>
  15. [DataField("idleKey")]
  16. public string IdleKey = "IdleTime";
  17. public override async Task<(bool Valid, Dictionary<string, object>? Effects)> Plan(NPCBlackboard blackboard, CancellationToken cancelToken)
  18. {
  19. return new(true, new Dictionary<string, object>()
  20. {
  21. { IdleKey, 1f }
  22. });
  23. }
  24. public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime)
  25. {
  26. var owner = blackboard.GetValue<EntityUid>(NPCBlackboard.Owner);
  27. var target = blackboard.GetValue<EntityUid>(Key);
  28. var intSystem = _entManager.System<SharedInteractionSystem>();
  29. var count = 0;
  30. if (_entManager.TryGetComponent<DoAfterComponent>(owner, out var doAfter))
  31. {
  32. count = doAfter.DoAfters.Count;
  33. }
  34. var result = intSystem.AltInteract(owner, target);
  35. // Interaction started a doafter so set the idle time to it.
  36. if (result && doAfter != null && count != doAfter.DoAfters.Count)
  37. {
  38. var wait = doAfter.DoAfters.First().Value.Args.Delay;
  39. blackboard.SetValue(IdleKey, (float) wait.TotalSeconds + 0.5f);
  40. }
  41. else
  42. {
  43. blackboard.SetValue(IdleKey, 1f);
  44. }
  45. return result ? HTNOperatorStatus.Finished : HTNOperatorStatus.Failed;
  46. }
  47. }