Files
tbd-station-14/Content.Shared/Spawning/EntitySystemExtensions.cs
metalgearsloth af05332b36 Random offset for DefaultGrid every round (#4411)
* Random offset for DefaultGrid every round

This is useful to make coders aware of entitycoordinates and mapcoordinates being different and to help spot problems early. It also puts the onus of fixing positioning bugs back onto the original coder rather than someone else if they happen to spot it.

* Fix clickable test

* Fix entitysystemextensions
2021-08-03 18:49:25 +10:00

86 lines
3.0 KiB
C#

using System.Diagnostics.CodeAnalysis;
using Content.Shared.Physics;
using Robust.Shared.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Broadphase;
namespace Content.Shared.Spawning
{
public static class EntitySystemExtensions
{
public static IEntity? SpawnIfUnobstructed(
this IEntityManager entityManager,
string? prototypeName,
EntityCoordinates coordinates,
CollisionGroup collisionLayer,
in Box2? box = null,
SharedBroadphaseSystem? physicsManager = null)
{
physicsManager ??= EntitySystem.Get<SharedBroadphaseSystem>();
var mapCoordinates = coordinates.ToMap(entityManager);
return entityManager.SpawnIfUnobstructed(prototypeName, mapCoordinates, collisionLayer, box, physicsManager);
}
public static IEntity? SpawnIfUnobstructed(
this IEntityManager entityManager,
string? prototypeName,
MapCoordinates coordinates,
CollisionGroup collisionLayer,
in Box2? box = null,
SharedBroadphaseSystem? collision = null)
{
var boxOrDefault = box.GetValueOrDefault(Box2.UnitCentered).Translated(coordinates.Position);
collision ??= EntitySystem.Get<SharedBroadphaseSystem>();
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 IEntity? entity,
Box2? box = null,
SharedBroadphaseSystem? 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 IEntity? entity,
in Box2? box = null,
SharedBroadphaseSystem? physicsManager = null)
{
entity = entityManager.SpawnIfUnobstructed(prototypeName, coordinates, collisionLayer, box, physicsManager);
return entity != null;
}
}
}