TurfHelpers.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System.Diagnostics.CodeAnalysis;
  2. using System.Linq;
  3. using System.Runtime.CompilerServices;
  4. using Content.Shared.Physics;
  5. using Robust.Shared.Map;
  6. using Robust.Shared.Map.Components;
  7. using Robust.Shared.Random;
  8. namespace Content.Shared.Maps
  9. {
  10. // TODO move all these methods to LookupSystem or TurfSystem
  11. // That, or make the interface arguments non-optional so people stop failing to pass them in.
  12. public static class TurfHelpers
  13. {
  14. /// <summary>
  15. /// Attempts to get the turf at a certain coordinates or null if no such turf is found.
  16. /// </summary>
  17. public static TileRef? GetTileRef(this EntityCoordinates coordinates, IEntityManager? entityManager = null, IMapManager? mapManager = null)
  18. {
  19. entityManager ??= IoCManager.Resolve<IEntityManager>();
  20. if (!coordinates.IsValid(entityManager))
  21. return null;
  22. mapManager ??= IoCManager.Resolve<IMapManager>();
  23. var pos = coordinates.ToMap(entityManager, entityManager.System<SharedTransformSystem>());
  24. if (!mapManager.TryFindGridAt(pos, out _, out var grid))
  25. return null;
  26. if (!grid.TryGetTileRef(coordinates, out var tile))
  27. return null;
  28. return tile;
  29. }
  30. public static bool TryGetTileRef(this EntityCoordinates coordinates, [NotNullWhen(true)] out TileRef? turf, IEntityManager? entityManager = null, IMapManager? mapManager = null)
  31. {
  32. return (turf = coordinates.GetTileRef(entityManager, mapManager)) != null;
  33. }
  34. /// <summary>
  35. /// Returns the content tile definition for a tile.
  36. /// </summary>
  37. public static ContentTileDefinition GetContentTileDefinition(this Tile tile, ITileDefinitionManager? tileDefinitionManager = null)
  38. {
  39. tileDefinitionManager ??= IoCManager.Resolve<ITileDefinitionManager>();
  40. return (ContentTileDefinition)tileDefinitionManager[tile.TypeId];
  41. }
  42. /// <summary>
  43. /// Returns whether a tile is considered space.
  44. /// </summary>
  45. public static bool IsSpace(this Tile tile, ITileDefinitionManager? tileDefinitionManager = null)
  46. {
  47. return tile.GetContentTileDefinition(tileDefinitionManager).MapAtmosphere;
  48. }
  49. /// <summary>
  50. /// Returns the content tile definition for a tile ref.
  51. /// </summary>
  52. public static ContentTileDefinition GetContentTileDefinition(this TileRef tile, ITileDefinitionManager? tileDefinitionManager = null)
  53. {
  54. return tile.Tile.GetContentTileDefinition(tileDefinitionManager);
  55. }
  56. /// <summary>
  57. /// Returns whether a tile ref is considered space.
  58. /// </summary>
  59. public static bool IsSpace(this TileRef tile, ITileDefinitionManager? tileDefinitionManager = null)
  60. {
  61. return tile.Tile.IsSpace(tileDefinitionManager);
  62. }
  63. /// <summary>
  64. /// Helper that returns all entities in a turf.
  65. /// </summary>
  66. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  67. [Obsolete("Use the lookup system")]
  68. public static IEnumerable<EntityUid> GetEntitiesInTile(this TileRef turf, LookupFlags flags = LookupFlags.Static, EntityLookupSystem? lookupSystem = null)
  69. {
  70. lookupSystem ??= EntitySystem.Get<EntityLookupSystem>();
  71. if (!GetWorldTileBox(turf, out var worldBox))
  72. return Enumerable.Empty<EntityUid>();
  73. return lookupSystem.GetEntitiesIntersecting(turf.GridUid, worldBox, flags);
  74. }
  75. /// <summary>
  76. /// Helper that returns all entities in a turf.
  77. /// </summary>
  78. [Obsolete("Use the lookup system")]
  79. public static IEnumerable<EntityUid> GetEntitiesInTile(this EntityCoordinates coordinates, LookupFlags flags = LookupFlags.Static, EntityLookupSystem? lookupSystem = null)
  80. {
  81. var turf = coordinates.GetTileRef();
  82. if (turf == null)
  83. return Enumerable.Empty<EntityUid>();
  84. return GetEntitiesInTile(turf.Value, flags, lookupSystem);
  85. }
  86. /// <summary>
  87. /// Checks if a turf has something dense on it.
  88. /// </summary>
  89. [Obsolete("Use turf system")]
  90. public static bool IsBlockedTurf(this TileRef turf, bool filterMobs, EntityLookupSystem? physics = null)
  91. {
  92. CollisionGroup mask = filterMobs
  93. ? CollisionGroup.MobMask
  94. : CollisionGroup.Impassable;
  95. return IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<TurfSystem>().IsTileBlocked(turf, mask);
  96. }
  97. /// <summary>
  98. /// Creates a box the size of a tile, at the same position in the world as the tile.
  99. /// </summary>
  100. [Obsolete]
  101. private static bool GetWorldTileBox(TileRef turf, out Box2Rotated res)
  102. {
  103. var entManager = IoCManager.Resolve<IEntityManager>();
  104. var xformSystem = entManager.System<SharedTransformSystem>();
  105. if (entManager.TryGetComponent<MapGridComponent>(turf.GridUid, out var tileGrid))
  106. {
  107. var gridRot = xformSystem.GetWorldRotation(turf.GridUid);
  108. // This is scaled to 90 % so it doesn't encompass walls on other tiles.
  109. var tileBox = Box2.UnitCentered.Scale(0.9f);
  110. tileBox = tileBox.Scale(tileGrid.TileSize);
  111. var worldPos = tileGrid.GridTileToWorldPos(turf.GridIndices);
  112. tileBox = tileBox.Translated(worldPos);
  113. // Now tileBox needs to be rotated to match grid rotation
  114. res = new Box2Rotated(tileBox, gridRot, worldPos);
  115. return true;
  116. }
  117. // Have to "return something"
  118. res = Box2Rotated.UnitCentered;
  119. return false;
  120. }
  121. }
  122. }