CatStation/Content.Shared/Coordinates/Helpers/SnapgridHelper.cs
TemporalOroboros 84b2f07157
The IMapManager is dead (#44002)
* Axes the easy IMapManager references

* Axes the references to unported (obsolete) IMapManager methods

* Converts salvageruler command to a LocalizedEntityCommand so it can use SharedMapSystem

* Removes IMapManager from GameTicker
This required axing the map nuke during restart, but that should be fine?
Maps are entities so EntityManager.FlushEntities should delete them all and that's the preceding line

* submodule update(?)

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2026-07-01 20:44:54 -07:00

46 lines
1.8 KiB
C#

using System.Numerics;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
namespace Content.Shared.Coordinates.Helpers
{
public static class SnapgridHelper
{
public static EntityCoordinates SnapToGrid(this EntityCoordinates coordinates, IEntityManager? entMan = null)
{
IoCManager.Resolve(ref entMan);
var xformSys = entMan.System<SharedTransformSystem>();
var gridId = xformSys.GetGrid(coordinates.EntityId);
if (gridId == null)
{
var mapPos = xformSys.ToMapCoordinates(coordinates);
var mapX = (int)Math.Floor(mapPos.X) + 0.5f;
var mapY = (int)Math.Floor(mapPos.Y) + 0.5f;
mapPos = new MapCoordinates(new Vector2(mapX, mapY), mapPos.MapId);
return xformSys.ToCoordinates(coordinates.EntityId, mapPos);
}
var grid = entMan.GetComponent<MapGridComponent>(gridId.Value);
var tileSize = grid.TileSize;
var localPos = xformSys.WithEntityId(coordinates, gridId.Value).Position;
var x = (int)Math.Floor(localPos.X / tileSize) + tileSize / 2f;
var y = (int)Math.Floor(localPos.Y / tileSize) + tileSize / 2f;
var gridPos = new EntityCoordinates(gridId.Value, new Vector2(x, y));
return xformSys.WithEntityId(gridPos, coordinates.EntityId);
}
public static EntityCoordinates SnapToGrid(this EntityCoordinates coordinates, MapGridComponent grid)
{
var tileSize = grid.TileSize;
var localPos = coordinates.Position;
var x = (int)Math.Floor(localPos.X / tileSize) + tileSize / 2f;
var y = (int)Math.Floor(localPos.Y / tileSize) + tileSize / 2f;
return new EntityCoordinates(coordinates.EntityId, x, y);
}
}
}