| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Runtime.CompilerServices;
- using Content.Shared.Physics;
- using Robust.Shared.Map;
- using Robust.Shared.Map.Components;
- using Robust.Shared.Random;
- namespace Content.Shared.Maps
- {
- // TODO move all these methods to LookupSystem or TurfSystem
- // That, or make the interface arguments non-optional so people stop failing to pass them in.
- public static class TurfHelpers
- {
- /// <summary>
- /// Attempts to get the turf at a certain coordinates or null if no such turf is found.
- /// </summary>
- public static TileRef? GetTileRef(this EntityCoordinates coordinates, IEntityManager? entityManager = null, IMapManager? mapManager = null)
- {
- entityManager ??= IoCManager.Resolve<IEntityManager>();
- if (!coordinates.IsValid(entityManager))
- return null;
- mapManager ??= IoCManager.Resolve<IMapManager>();
- var pos = coordinates.ToMap(entityManager, entityManager.System<SharedTransformSystem>());
- if (!mapManager.TryFindGridAt(pos, out _, out var grid))
- return null;
- if (!grid.TryGetTileRef(coordinates, out var tile))
- return null;
- return tile;
- }
- public static bool TryGetTileRef(this EntityCoordinates coordinates, [NotNullWhen(true)] out TileRef? turf, IEntityManager? entityManager = null, IMapManager? mapManager = null)
- {
- return (turf = coordinates.GetTileRef(entityManager, mapManager)) != null;
- }
- /// <summary>
- /// Returns the content tile definition for a tile.
- /// </summary>
- public static ContentTileDefinition GetContentTileDefinition(this Tile tile, ITileDefinitionManager? tileDefinitionManager = null)
- {
- tileDefinitionManager ??= IoCManager.Resolve<ITileDefinitionManager>();
- return (ContentTileDefinition)tileDefinitionManager[tile.TypeId];
- }
- /// <summary>
- /// Returns whether a tile is considered space.
- /// </summary>
- public static bool IsSpace(this Tile tile, ITileDefinitionManager? tileDefinitionManager = null)
- {
- return tile.GetContentTileDefinition(tileDefinitionManager).MapAtmosphere;
- }
- /// <summary>
- /// Returns the content tile definition for a tile ref.
- /// </summary>
- public static ContentTileDefinition GetContentTileDefinition(this TileRef tile, ITileDefinitionManager? tileDefinitionManager = null)
- {
- return tile.Tile.GetContentTileDefinition(tileDefinitionManager);
- }
- /// <summary>
- /// Returns whether a tile ref is considered space.
- /// </summary>
- public static bool IsSpace(this TileRef tile, ITileDefinitionManager? tileDefinitionManager = null)
- {
- return tile.Tile.IsSpace(tileDefinitionManager);
- }
- /// <summary>
- /// Helper that returns all entities in a turf.
- /// </summary>
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- [Obsolete("Use the lookup system")]
- public static IEnumerable<EntityUid> GetEntitiesInTile(this TileRef turf, LookupFlags flags = LookupFlags.Static, EntityLookupSystem? lookupSystem = null)
- {
- lookupSystem ??= EntitySystem.Get<EntityLookupSystem>();
- if (!GetWorldTileBox(turf, out var worldBox))
- return Enumerable.Empty<EntityUid>();
- return lookupSystem.GetEntitiesIntersecting(turf.GridUid, worldBox, flags);
- }
- /// <summary>
- /// Helper that returns all entities in a turf.
- /// </summary>
- [Obsolete("Use the lookup system")]
- public static IEnumerable<EntityUid> GetEntitiesInTile(this EntityCoordinates coordinates, LookupFlags flags = LookupFlags.Static, EntityLookupSystem? lookupSystem = null)
- {
- var turf = coordinates.GetTileRef();
- if (turf == null)
- return Enumerable.Empty<EntityUid>();
- return GetEntitiesInTile(turf.Value, flags, lookupSystem);
- }
- /// <summary>
- /// Checks if a turf has something dense on it.
- /// </summary>
- [Obsolete("Use turf system")]
- public static bool IsBlockedTurf(this TileRef turf, bool filterMobs, EntityLookupSystem? physics = null)
- {
- CollisionGroup mask = filterMobs
- ? CollisionGroup.MobMask
- : CollisionGroup.Impassable;
- return IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<TurfSystem>().IsTileBlocked(turf, mask);
- }
- /// <summary>
- /// Creates a box the size of a tile, at the same position in the world as the tile.
- /// </summary>
- [Obsolete]
- private static bool GetWorldTileBox(TileRef turf, out Box2Rotated res)
- {
- var entManager = IoCManager.Resolve<IEntityManager>();
- var xformSystem = entManager.System<SharedTransformSystem>();
- if (entManager.TryGetComponent<MapGridComponent>(turf.GridUid, out var tileGrid))
- {
- var gridRot = xformSystem.GetWorldRotation(turf.GridUid);
- // This is scaled to 90 % so it doesn't encompass walls on other tiles.
- var tileBox = Box2.UnitCentered.Scale(0.9f);
- tileBox = tileBox.Scale(tileGrid.TileSize);
- var worldPos = tileGrid.GridTileToWorldPos(turf.GridIndices);
- tileBox = tileBox.Translated(worldPos);
- // Now tileBox needs to be rotated to match grid rotation
- res = new Box2Rotated(tileBox, gridRot, worldPos);
- return true;
- }
- // Have to "return something"
- res = Box2Rotated.UnitCentered;
- return false;
- }
- }
- }
|