#nullable enable using System.Collections.Generic; using Content.Shared.Physics; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; using Robust.Shared.Interfaces.Physics; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; namespace Content.Shared.Maps { public static class TurfHelpers { /// /// Returns the content tile definition for a tile. /// public static ContentTileDefinition GetContentTileDefinition(this Tile tile) { var tileDefinitionManager = IoCManager.Resolve(); return (ContentTileDefinition)tileDefinitionManager[tile.TypeId]; } /// /// Attempts to get the turf at map indices with grid id or null if no such turf is found. /// public static TileRef? GetTileRef(this MapIndices mapIndices, GridId gridId) { if (!gridId.IsValid()) return null; var mapManager = IoCManager.Resolve(); if (!mapManager.TryGetGrid(gridId, out var grid)) return null; if (!grid.TryGetTileRef(mapIndices, out var tile)) return null; return tile; } /// /// Attempts to get the turf at a certain coordinates or null if no such turf is found. /// public static TileRef? GetTileRef(this GridCoordinates coordinates) { if (!coordinates.GridID.IsValid()) return null; var mapManager = IoCManager.Resolve(); if (!mapManager.TryGetGrid(coordinates.GridID, out var grid)) return null; if (!grid.TryGetTileRef(coordinates.ToMapIndices(mapManager), out var tile)) return null; return tile; } /// /// Helper that returns all entities in a turf. /// public static IEnumerable GetEntitiesInTile(this TileRef turf, bool approximate = false) { var entityManager = IoCManager.Resolve(); return entityManager.GetEntitiesIntersecting(turf.MapIndex, GetWorldTileBox(turf), approximate); } /// /// Checks if a turf has something dense on it. /// public static bool IsBlockedTurf(this TileRef turf, bool filterMobs) { var physics = IoCManager.Resolve(); var worldBox = GetWorldTileBox(turf); var query = physics.GetCollidingEntities(turf.MapIndex, in worldBox); foreach (var body in query) { if (body.CanCollide && body.Hard && (body.CollisionLayer & (int) CollisionGroup.Impassable) != 0) return true; if (filterMobs && (body.CollisionLayer & (int) CollisionGroup.MobMask) != 0) return true; } return false; } /// /// Creates a box the size of a tile, at the same position in the world as the tile. /// private static Box2 GetWorldTileBox(TileRef turf) { var map = IoCManager.Resolve(); var tileGrid = map.GetGrid(turf.GridIndex); var tileBox = Box2.UnitCentered.Scale(tileGrid.TileSize); return tileBox.Translated(tileGrid.GridTileToWorldPos(turf.GridIndices)); } /// /// Creates a box the size of a tile. /// private static Box2 GetTileBox(this TileRef turf) { var map = IoCManager.Resolve(); var tileGrid = map.GetGrid(turf.GridIndex); return Box2.UnitCentered.Scale(tileGrid.TileSize); } } }