using JetBrains.Annotations;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Maths;
namespace Robust.Shared.GameObjects;
public abstract partial class SharedMapSystem
{
///
/// If the supplied coordinates intersects a grid will align with the tile center, otherwise returns the coordinates.
///
///
///
[Pure]
public EntityCoordinates AlignToGrid(EntityCoordinates coordinates)
{
// Check if the parent is already a grid.
if (_gridQuery.TryGetComponent(coordinates.EntityId, out var gridComponent))
{
var tile = CoordinatesToTile(coordinates.EntityId, gridComponent, coordinates);
return ToCenterCoordinates(coordinates.EntityId, tile, gridComponent);
}
// Check if mappos intersects a grid.
var mapPos = _transform.ToMapCoordinates(coordinates);
if (TryFindGridAt(mapPos, out var gridUid, out gridComponent))
{
var tile = CoordinatesToTile(gridUid, gridComponent, coordinates);
return ToCenterCoordinates(gridUid, tile, gridComponent);
}
// No grid so just return it.
return coordinates;
}
///
/// Converts a tileRef to EntityCoordinates.
///
[Pure]
public EntityCoordinates ToCoordinates(TileRef tileRef, MapGridComponent? gridComponent = null)
{
return ToCoordinates(tileRef.GridUid, tileRef.GridIndices, gridComponent);
}
///
/// Converts a tileRef to EntityCoordinates.
///
[Pure]
public EntityCoordinates ToCoordinates(EntityUid gridUid, Vector2i tile, MapGridComponent? gridComponent = null)
{
if (!_gridQuery.Resolve(gridUid, ref gridComponent))
{
return EntityCoordinates.Invalid;
}
return new EntityCoordinates(gridUid, tile * gridComponent.TileSize);
}
///
/// Converts a tileRef to EntityCoordinates for the center of the tile.
///
[Pure]
public EntityCoordinates ToCenterCoordinates(TileRef tileRef, MapGridComponent? gridComponent = null)
{
return ToCenterCoordinates(tileRef.GridUid, tileRef.GridIndices, gridComponent);
}
///
/// Converts a tileRef to EntityCoordinates for the center of the tile.
///
[Pure]
public EntityCoordinates ToCenterCoordinates(EntityUid gridUid, Vector2i tile, MapGridComponent? gridComponent = null)
{
if (!_gridQuery.Resolve(gridUid, ref gridComponent))
{
return EntityCoordinates.Invalid;
}
return new EntityCoordinates(gridUid, tile * gridComponent.TileSize + gridComponent.TileSizeHalfVector);
}
}