| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- using System.Diagnostics.CodeAnalysis;
- using Content.Shared.Physics;
- using Robust.Shared.Map;
- using Robust.Shared.Physics.Systems;
- namespace Content.Shared.Spawning
- {
- public static class EntitySystemExtensions
- {
- public static EntityUid? SpawnIfUnobstructed(
- this IEntityManager entityManager,
- string? prototypeName,
- EntityCoordinates coordinates,
- CollisionGroup collisionLayer,
- in Box2? box = null,
- SharedPhysicsSystem? physicsManager = null)
- {
- physicsManager ??= entityManager.System<SharedPhysicsSystem>();
- var mapCoordinates = coordinates.ToMap(entityManager, entityManager.System<SharedTransformSystem>());
- return entityManager.SpawnIfUnobstructed(prototypeName, mapCoordinates, collisionLayer, box, physicsManager);
- }
- public static EntityUid? SpawnIfUnobstructed(
- this IEntityManager entityManager,
- string? prototypeName,
- MapCoordinates coordinates,
- CollisionGroup collisionLayer,
- in Box2? box = null,
- SharedPhysicsSystem? collision = null)
- {
- var boxOrDefault = box.GetValueOrDefault(Box2.UnitCentered).Translated(coordinates.Position);
- collision ??= entityManager.System<SharedPhysicsSystem>();
- foreach (var body in collision.GetCollidingEntities(coordinates.MapId, in boxOrDefault))
- {
- if (!body.Hard)
- {
- continue;
- }
- // TODO: wtf fix this
- if (collisionLayer == 0 || (body.CollisionMask & (int) collisionLayer) == 0)
- {
- continue;
- }
- return null;
- }
- return entityManager.SpawnEntity(prototypeName, coordinates);
- }
- public static bool TrySpawnIfUnobstructed(
- this IEntityManager entityManager,
- string? prototypeName,
- EntityCoordinates coordinates,
- CollisionGroup collisionLayer,
- [NotNullWhen(true)] out EntityUid? entity,
- Box2? box = null,
- SharedPhysicsSystem? physicsManager = null)
- {
- entity = entityManager.SpawnIfUnobstructed(prototypeName, coordinates, collisionLayer, box, physicsManager);
- return entity != null;
- }
- public static bool TrySpawnIfUnobstructed(
- this IEntityManager entityManager,
- string? prototypeName,
- MapCoordinates coordinates,
- CollisionGroup collisionLayer,
- [NotNullWhen(true)] out EntityUid? entity,
- in Box2? box = null,
- SharedPhysicsSystem? physicsManager = null)
- {
- entity = entityManager.SpawnIfUnobstructed(prototypeName, coordinates, collisionLayer, box, physicsManager);
- return entity != null;
- }
- }
- }
|