TargetInLOSPrecondition.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. using Content.Server.Interaction;
  2. using Content.Shared.Physics;
  3. namespace Content.Server.NPC.HTN.Preconditions;
  4. public sealed partial class TargetInLOSPrecondition : HTNPrecondition
  5. {
  6. [Dependency] private readonly IEntityManager _entManager = default!;
  7. private InteractionSystem _interaction = default!;
  8. [DataField("targetKey")]
  9. public string TargetKey = "Target";
  10. [DataField("rangeKey")]
  11. public string RangeKey = "RangeKey";
  12. [DataField("opaqueKey")]
  13. public bool UseOpaqueForLOSChecksKey = true;
  14. public override void Initialize(IEntitySystemManager sysManager)
  15. {
  16. base.Initialize(sysManager);
  17. _interaction = sysManager.GetEntitySystem<InteractionSystem>();
  18. }
  19. public override bool IsMet(NPCBlackboard blackboard)
  20. {
  21. var owner = blackboard.GetValue<EntityUid>(NPCBlackboard.Owner);
  22. if (!blackboard.TryGetValue<EntityUid>(TargetKey, out var target, _entManager))
  23. return false;
  24. var range = blackboard.GetValueOrDefault<float>(RangeKey, _entManager);
  25. var collisionGroup = UseOpaqueForLOSChecksKey ? CollisionGroup.Opaque : (CollisionGroup.Impassable | CollisionGroup.InteractImpassable);
  26. return _interaction.InRangeUnobstructed(owner, target, range, collisionGroup);
  27. }
  28. }