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.