2023-10-19 12:34:31 -07:00
|
|
|
using System.Diagnostics.CodeAnalysis;
|
2020-08-19 12:23:42 +02:00
|
|
|
using System.Linq;
|
|
|
|
|
using System.Runtime.CompilerServices;
|
2020-08-11 03:45:40 +02:00
|
|
|
using Content.Shared.Physics;
|
2020-08-06 22:02:13 -07:00
|
|
|
using Robust.Shared.Map;
|
2024-03-22 03:08:40 -04:00
|
|
|
using Robust.Shared.Map.Components;
|
2021-11-24 04:15:49 +11:00
|
|
|
using Robust.Shared.Random;
|
2020-08-06 22:02:13 -07:00
|
|
|
|
|
|
|
|
namespace Content.Shared.Maps
|
|
|
|
|
{
|
2023-04-21 17:06:10 +12:00
|
|
|
// TODO move all these methods to LookupSystem or TurfSystem
|
|
|
|
|
// That, or make the interface arguments non-optional so people stop failing to pass them in.
|
2020-08-06 22:02:13 -07:00
|
|
|
public static class TurfHelpers
|
|
|
|
|
{
|
2020-08-11 03:45:40 +02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Attempts to get the turf at a certain coordinates or null if no such turf is found.
|
|
|
|
|
/// </summary>
|
2020-09-06 16:11:53 +02:00
|
|
|
public static TileRef? GetTileRef(this EntityCoordinates coordinates, IEntityManager? entityManager = null, IMapManager? mapManager = null)
|
2020-08-11 03:45:40 +02:00
|
|
|
{
|
2020-09-06 16:11:53 +02:00
|
|
|
entityManager ??= IoCManager.Resolve<IEntityManager>();
|
|
|
|
|
|
|
|
|
|
if (!coordinates.IsValid(entityManager))
|
2020-08-11 03:45:40 +02:00
|
|
|
return null;
|
|
|
|
|
|
2020-09-06 16:11:53 +02:00
|
|
|
mapManager ??= IoCManager.Resolve<IMapManager>();
|
2023-04-12 12:18:30 +12:00
|
|
|
var pos = coordinates.ToMap(entityManager, entityManager.System<SharedTransformSystem>());
|
2023-05-28 23:22:44 +10:00
|
|
|
if (!mapManager.TryFindGridAt(pos, out _, out var grid))
|
2020-08-11 03:45:40 +02:00
|
|
|
return null;
|
|
|
|
|
|
2020-09-06 17:05:01 +02:00
|
|
|
if (!grid.TryGetTileRef(coordinates, out var tile))
|
2020-08-11 03:45:40 +02:00
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
return tile;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-01 00:04:56 -07:00
|
|
|
public static bool TryGetTileRef(this EntityCoordinates coordinates, [NotNullWhen(true)] out TileRef? turf, IEntityManager? entityManager = null, IMapManager? mapManager = null)
|
2020-09-01 23:28:59 +02:00
|
|
|
{
|
2021-04-01 00:04:56 -07:00
|
|
|
return (turf = coordinates.GetTileRef(entityManager, mapManager)) != null;
|
2020-09-01 23:28:59 +02:00
|
|
|
}
|
|
|
|
|
|
2020-11-25 10:48:49 +01:00
|
|
|
/// <summary>
|
|
|
|
|
/// Returns the content tile definition for a tile.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static ContentTileDefinition GetContentTileDefinition(this Tile tile, ITileDefinitionManager? tileDefinitionManager = null)
|
|
|
|
|
{
|
|
|
|
|
tileDefinitionManager ??= IoCManager.Resolve<ITileDefinitionManager>();
|
|
|
|
|
return (ContentTileDefinition)tileDefinitionManager[tile.TypeId];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Returns whether a tile is considered space.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static bool IsSpace(this Tile tile, ITileDefinitionManager? tileDefinitionManager = null)
|
|
|
|
|
{
|
2024-03-24 03:34:56 +11:00
|
|
|
return tile.GetContentTileDefinition(tileDefinitionManager).MapAtmosphere;
|
2020-11-25 10:48:49 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Returns the content tile definition for a tile ref.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static ContentTileDefinition GetContentTileDefinition(this TileRef tile, ITileDefinitionManager? tileDefinitionManager = null)
|
|
|
|
|
{
|
|
|
|
|
return tile.Tile.GetContentTileDefinition(tileDefinitionManager);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Returns whether a tile ref is considered space.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static bool IsSpace(this TileRef tile, ITileDefinitionManager? tileDefinitionManager = null)
|
|
|
|
|
{
|
|
|
|
|
return tile.Tile.IsSpace(tileDefinitionManager);
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-11 03:45:40 +02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Helper that returns all entities in a turf.
|
|
|
|
|
/// </summary>
|
2020-08-19 12:23:42 +02:00
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
2023-04-21 17:06:10 +12:00
|
|
|
[Obsolete("Use the lookup system")]
|
2022-12-15 17:29:46 +13:00
|
|
|
public static IEnumerable<EntityUid> GetEntitiesInTile(this TileRef turf, LookupFlags flags = LookupFlags.Static, EntityLookupSystem? lookupSystem = null)
|
2020-08-11 03:45:40 +02:00
|
|
|
{
|
2022-03-03 21:18:35 +11:00
|
|
|
lookupSystem ??= EntitySystem.Get<EntityLookupSystem>();
|
2020-08-11 03:45:40 +02:00
|
|
|
|
2021-10-25 15:14:21 +01:00
|
|
|
if (!GetWorldTileBox(turf, out var worldBox))
|
2021-12-04 12:47:09 +01:00
|
|
|
return Enumerable.Empty<EntityUid>();
|
2021-10-25 15:14:21 +01:00
|
|
|
|
2022-06-11 18:54:41 -07:00
|
|
|
return lookupSystem.GetEntitiesIntersecting(turf.GridUid, worldBox, flags);
|
2020-08-11 03:45:40 +02:00
|
|
|
}
|
|
|
|
|
|
2020-08-19 12:23:42 +02:00
|
|
|
/// <summary>
|
|
|
|
|
/// Helper that returns all entities in a turf.
|
|
|
|
|
/// </summary>
|
2023-04-21 17:06:10 +12:00
|
|
|
[Obsolete("Use the lookup system")]
|
2022-12-15 17:29:46 +13:00
|
|
|
public static IEnumerable<EntityUid> GetEntitiesInTile(this EntityCoordinates coordinates, LookupFlags flags = LookupFlags.Static, EntityLookupSystem? lookupSystem = null)
|
2020-08-19 12:23:42 +02:00
|
|
|
{
|
|
|
|
|
var turf = coordinates.GetTileRef();
|
|
|
|
|
|
|
|
|
|
if (turf == null)
|
2021-12-04 12:47:09 +01:00
|
|
|
return Enumerable.Empty<EntityUid>();
|
2020-08-19 12:23:42 +02:00
|
|
|
|
2021-08-29 14:23:11 +10:00
|
|
|
return GetEntitiesInTile(turf.Value, flags, lookupSystem);
|
2020-08-19 12:23:42 +02:00
|
|
|
}
|
|
|
|
|
|
2020-08-06 22:02:13 -07:00
|
|
|
/// <summary>
|
|
|
|
|
/// Checks if a turf has something dense on it.
|
|
|
|
|
/// </summary>
|
2023-04-21 17:06:10 +12:00
|
|
|
[Obsolete("Use turf system")]
|
|
|
|
|
public static bool IsBlockedTurf(this TileRef turf, bool filterMobs, EntityLookupSystem? physics = null)
|
2020-08-06 22:02:13 -07:00
|
|
|
{
|
2023-04-21 17:06:10 +12:00
|
|
|
CollisionGroup mask = filterMobs
|
|
|
|
|
? CollisionGroup.MobMask
|
|
|
|
|
: CollisionGroup.Impassable;
|
2020-08-06 22:02:13 -07:00
|
|
|
|
2023-04-21 17:06:10 +12:00
|
|
|
return IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<TurfSystem>().IsTileBlocked(turf, mask);
|
2020-08-06 22:02:13 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Creates a box the size of a tile, at the same position in the world as the tile.
|
|
|
|
|
/// </summary>
|
2022-11-01 11:27:18 +11:00
|
|
|
[Obsolete]
|
2021-10-25 15:14:21 +01:00
|
|
|
private static bool GetWorldTileBox(TileRef turf, out Box2Rotated res)
|
2020-08-06 22:02:13 -07:00
|
|
|
{
|
2022-11-01 11:27:18 +11:00
|
|
|
var entManager = IoCManager.Resolve<IEntityManager>();
|
2020-10-08 17:41:23 +02:00
|
|
|
|
2024-03-22 03:08:40 -04:00
|
|
|
if (entManager.TryGetComponent<MapGridComponent>(turf.GridUid, out var tileGrid))
|
2020-10-21 17:13:41 +02:00
|
|
|
{
|
2024-02-28 00:51:20 +11:00
|
|
|
var gridRot = entManager.GetComponent<TransformComponent>(turf.GridUid).WorldRotation;
|
2022-11-01 11:27:18 +11:00
|
|
|
|
2021-10-25 15:14:21 +01:00
|
|
|
// This is scaled to 90 % so it doesn't encompass walls on other tiles.
|
|
|
|
|
var tileBox = Box2.UnitCentered.Scale(0.9f);
|
2020-10-21 17:13:41 +02:00
|
|
|
tileBox = tileBox.Scale(tileGrid.TileSize);
|
2021-10-25 15:14:21 +01:00
|
|
|
var worldPos = tileGrid.GridTileToWorldPos(turf.GridIndices);
|
|
|
|
|
tileBox = tileBox.Translated(worldPos);
|
|
|
|
|
// Now tileBox needs to be rotated to match grid rotation
|
2022-11-01 11:27:18 +11:00
|
|
|
res = new Box2Rotated(tileBox, gridRot, worldPos);
|
2021-10-25 15:14:21 +01:00
|
|
|
return true;
|
2020-10-21 17:13:41 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-25 15:14:21 +01:00
|
|
|
// Have to "return something"
|
|
|
|
|
res = Box2Rotated.UnitCentered;
|
|
|
|
|
return false;
|
2020-08-06 22:02:13 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|