using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Maths; namespace Content.Server.NodeContainer.Nodes { /// /// Helper utilities for implementing . /// public static class NodeHelpers { public static IEnumerable GetNodesInTile(EntityQuery nodeQuery, IMapGrid grid, Vector2i coords) { foreach (var entityUid in grid.GetAnchoredEntities(coords)) { if (!nodeQuery.TryGetComponent(entityUid, out var container)) continue; foreach (var node in container.Nodes.Values) { yield return node; } } } public static IEnumerable<(Direction dir, Node node)> GetCardinalNeighborNodes( EntityQuery nodeQuery, IMapGrid grid, Vector2i coords, bool includeSameTile = true) { foreach (var (dir, entityUid) in GetCardinalNeighborCells(grid, coords, includeSameTile)) { if (!nodeQuery.TryGetComponent(entityUid, out var container)) continue; foreach (var node in container.Nodes.Values) { yield return (dir, node); } } } [SuppressMessage("ReSharper", "EnforceForeachStatementBraces")] public static IEnumerable<(Direction dir, EntityUid entity)> GetCardinalNeighborCells( IMapGrid grid, Vector2i coords, bool includeSameTile = true) { if (includeSameTile) { foreach (var uid in grid.GetAnchoredEntities(coords)) yield return (Direction.Invalid, uid); } foreach (var uid in grid.GetAnchoredEntities(coords + (0, 1))) yield return (Direction.North, uid); foreach (var uid in grid.GetAnchoredEntities(coords + (0, -1))) yield return (Direction.South, uid); foreach (var uid in grid.GetAnchoredEntities(coords + (1, 0))) yield return (Direction.East, uid); foreach (var uid in grid.GetAnchoredEntities(coords + (-1, 0))) yield return (Direction.West, uid); } } }