1
0

PickPathfindPointOperator.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using System.Linq;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4. using Content.Server.NPC.Components;
  5. using Robust.Shared.Random;
  6. namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Test;
  7. public sealed partial class PickPathfindPointOperator : HTNOperator
  8. {
  9. [Dependency] private readonly IEntityManager _entManager = default!;
  10. [Dependency] private readonly IRobustRandom _random = default!;
  11. public override async Task<(bool Valid, Dictionary<string, object>? Effects)> Plan(NPCBlackboard blackboard,
  12. CancellationToken cancelToken)
  13. {
  14. var owner = blackboard.GetValue<EntityUid>(NPCBlackboard.Owner);
  15. // Find all pathfind points on the same grid and choose to move to it.
  16. var xform = _entManager.GetComponent<TransformComponent>(owner);
  17. var gridUid = xform.GridUid;
  18. if (gridUid == null)
  19. return (false, null);
  20. var points = new List<TransformComponent>();
  21. foreach (var (point, pointXform) in _entManager.EntityQuery<NPCPathfindPointComponent, TransformComponent>(true))
  22. {
  23. if (gridUid != pointXform.GridUid)
  24. continue;
  25. points.Add(pointXform);
  26. }
  27. if (points.Count == 0)
  28. return (false, null);
  29. var selected = _random.Pick(points);
  30. return (true, new Dictionary<string, object>()
  31. {
  32. { NPCBlackboard.MovementTarget, selected.Coordinates }
  33. });
  34. }
  35. }