NearbyComponents.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Robust.Shared.Prototypes;
  2. namespace Content.Shared.Random.Rules;
  3. public sealed partial class NearbyComponentsRule : RulesRule
  4. {
  5. /// <summary>
  6. /// Does the entity need to be anchored.
  7. /// </summary>
  8. [DataField]
  9. public bool Anchored;
  10. [DataField]
  11. public int Count;
  12. [DataField(required: true)]
  13. public ComponentRegistry Components = default!;
  14. [DataField]
  15. public float Range = 10f;
  16. public override bool Check(EntityManager entManager, EntityUid uid)
  17. {
  18. var inRange = new HashSet<Entity<IComponent>>();
  19. var xformQuery = entManager.GetEntityQuery<TransformComponent>();
  20. if (!xformQuery.TryGetComponent(uid, out var xform) ||
  21. xform.MapUid == null)
  22. {
  23. return false;
  24. }
  25. var transform = entManager.System<SharedTransformSystem>();
  26. var lookup = entManager.System<EntityLookupSystem>();
  27. var found = false;
  28. var worldPos = transform.GetWorldPosition(xform);
  29. var count = 0;
  30. foreach (var compType in Components.Values)
  31. {
  32. inRange.Clear();
  33. lookup.GetEntitiesInRange(compType.Component.GetType(), xform.MapID, worldPos, Range, inRange);
  34. foreach (var comp in inRange)
  35. {
  36. if (Anchored &&
  37. (!xformQuery.TryGetComponent(comp, out var compXform) ||
  38. !compXform.Anchored))
  39. {
  40. continue;
  41. }
  42. count++;
  43. if (count < Count)
  44. continue;
  45. found = true;
  46. break;
  47. }
  48. if (found)
  49. break;
  50. }
  51. if (!found)
  52. return Inverted;
  53. return !Inverted;
  54. }
  55. }