* Various systems warnings cleanup * Last changes before submitting PR * Add guard for transform component, fix failing test * Small corrections * Audio params to specifiers datafields * Using audio params on components and configs
83 lines
2.9 KiB
C#
83 lines
2.9 KiB
C#
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 = entityManager.System<SharedTransformSystem>().ToMapCoordinates(coordinates);
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|