From b459d2ce21799a3d43eb7373ac4701fb0adfafbb Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Wed, 22 Nov 2023 23:51:46 +1300 Subject: [PATCH] Add more map system helper methods. (#4589) --- .../Systems/SharedMapSystem.Grid.cs | 33 +++++++++++++++++++ .../GameObjects/Systems/SharedMapSystem.cs | 1 + Robust.Shared/Map/ITileDefinitionManager.cs | 1 + 3 files changed, 35 insertions(+) diff --git a/Robust.Shared/GameObjects/Systems/SharedMapSystem.Grid.cs b/Robust.Shared/GameObjects/Systems/SharedMapSystem.Grid.cs index 9e81fb5864..c2ef2278a9 100644 --- a/Robust.Shared/GameObjects/Systems/SharedMapSystem.Grid.cs +++ b/Robust.Shared/GameObjects/Systems/SharedMapSystem.Grid.cs @@ -1292,6 +1292,9 @@ public abstract partial class SharedMapSystem } public Vector2i GridTileToChunkIndices(EntityUid uid, MapGridComponent grid, Vector2i gridTile) + => GridTileToChunkIndices(grid, gridTile); + + public Vector2i GridTileToChunkIndices(MapGridComponent grid, Vector2i gridTile) { var x = (int)Math.Floor(gridTile.X / (float) grid.ChunkSize); var y = (int)Math.Floor(gridTile.Y / (float) grid.ChunkSize); @@ -1334,6 +1337,36 @@ public abstract partial class SharedMapSystem return true; } + public bool TryGetTile(MapGridComponent grid, Vector2i indices, out Tile tile) + { + var chunkIndices = GridTileToChunkIndices(grid, indices); + if (!grid.Chunks.TryGetValue(chunkIndices, out var chunk)) + { + tile = default; + return false; + } + + var cTileIndices = chunk.GridTileToChunkTile(indices); + tile = chunk.Tiles[cTileIndices.X, cTileIndices.Y]; + return true; + } + + /// + /// Attempts to get the for the tile at the given grid indices. This will throw an + /// exception if the tile at this location has no registered tile definition. + /// + public bool TryGetTileDef(MapGridComponent grid, Vector2i indices, [NotNullWhen(true)] out ITileDefinition? tileDef) + { + if (!TryGetTile(grid, indices, out var tile)) + { + tileDef = null; + return false; + } + + tileDef = _tileMan[tile.TypeId]; + return true; + } + public bool TryGetTileRef(EntityUid uid, MapGridComponent grid, EntityCoordinates coords, out TileRef tile) { return TryGetTileRef(uid, grid, CoordinatesToTile(uid, grid, coords), out tile); diff --git a/Robust.Shared/GameObjects/Systems/SharedMapSystem.cs b/Robust.Shared/GameObjects/Systems/SharedMapSystem.cs index 002235c59d..42f7feac44 100644 --- a/Robust.Shared/GameObjects/Systems/SharedMapSystem.cs +++ b/Robust.Shared/GameObjects/Systems/SharedMapSystem.cs @@ -12,6 +12,7 @@ namespace Robust.Shared.GameObjects { public abstract partial class SharedMapSystem : EntitySystem { + [Dependency] private readonly ITileDefinitionManager _tileMan = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] protected readonly IMapManager MapManager = default!; [Dependency] private readonly IMapManagerInternal _mapInternal = default!; diff --git a/Robust.Shared/Map/ITileDefinitionManager.cs b/Robust.Shared/Map/ITileDefinitionManager.cs index 08eff0bb80..4175350f5b 100644 --- a/Robust.Shared/Map/ITileDefinitionManager.cs +++ b/Robust.Shared/Map/ITileDefinitionManager.cs @@ -30,6 +30,7 @@ namespace Robust.Shared.Map /// The ID of the tile definition. /// The tile definition. ITileDefinition this[int id] { get; } + // TODO add a try get and get-or-null variant. /// /// The number of tile definitions contained inside of this manager.