1
0

EntitySystemExtensions.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System.Diagnostics.CodeAnalysis;
  2. using Content.Shared.Physics;
  3. using Robust.Shared.Map;
  4. using Robust.Shared.Physics.Systems;
  5. namespace Content.Shared.Spawning
  6. {
  7. public static class EntitySystemExtensions
  8. {
  9. public static EntityUid? SpawnIfUnobstructed(
  10. this IEntityManager entityManager,
  11. string? prototypeName,
  12. EntityCoordinates coordinates,
  13. CollisionGroup collisionLayer,
  14. in Box2? box = null,
  15. SharedPhysicsSystem? physicsManager = null)
  16. {
  17. physicsManager ??= entityManager.System<SharedPhysicsSystem>();
  18. var mapCoordinates = coordinates.ToMap(entityManager, entityManager.System<SharedTransformSystem>());
  19. return entityManager.SpawnIfUnobstructed(prototypeName, mapCoordinates, collisionLayer, box, physicsManager);
  20. }
  21. public static EntityUid? SpawnIfUnobstructed(
  22. this IEntityManager entityManager,
  23. string? prototypeName,
  24. MapCoordinates coordinates,
  25. CollisionGroup collisionLayer,
  26. in Box2? box = null,
  27. SharedPhysicsSystem? collision = null)
  28. {
  29. var boxOrDefault = box.GetValueOrDefault(Box2.UnitCentered).Translated(coordinates.Position);
  30. collision ??= entityManager.System<SharedPhysicsSystem>();
  31. foreach (var body in collision.GetCollidingEntities(coordinates.MapId, in boxOrDefault))
  32. {
  33. if (!body.Hard)
  34. {
  35. continue;
  36. }
  37. // TODO: wtf fix this
  38. if (collisionLayer == 0 || (body.CollisionMask & (int) collisionLayer) == 0)
  39. {
  40. continue;
  41. }
  42. return null;
  43. }
  44. return entityManager.SpawnEntity(prototypeName, coordinates);
  45. }
  46. public static bool TrySpawnIfUnobstructed(
  47. this IEntityManager entityManager,
  48. string? prototypeName,
  49. EntityCoordinates coordinates,
  50. CollisionGroup collisionLayer,
  51. [NotNullWhen(true)] out EntityUid? entity,
  52. Box2? box = null,
  53. SharedPhysicsSystem? physicsManager = null)
  54. {
  55. entity = entityManager.SpawnIfUnobstructed(prototypeName, coordinates, collisionLayer, box, physicsManager);
  56. return entity != null;
  57. }
  58. public static bool TrySpawnIfUnobstructed(
  59. this IEntityManager entityManager,
  60. string? prototypeName,
  61. MapCoordinates coordinates,
  62. CollisionGroup collisionLayer,
  63. [NotNullWhen(true)] out EntityUid? entity,
  64. in Box2? box = null,
  65. SharedPhysicsSystem? physicsManager = null)
  66. {
  67. entity = entityManager.SpawnIfUnobstructed(prototypeName, coordinates, collisionLayer, box, physicsManager);
  68. return entity != null;
  69. }
  70. }
  71. }