1
0

SharedDockingSystem.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Content.Shared.Shuttles.Components;
  2. using Robust.Shared.Map;
  3. namespace Content.Shared.Shuttles.Systems;
  4. public abstract class SharedDockingSystem : EntitySystem
  5. {
  6. [Dependency] protected readonly SharedTransformSystem XformSystem = default!;
  7. public const float DockingHiglightRange = 4f;
  8. public const float DockRange = 1f + 0.2f;
  9. public static readonly double AlignmentTolerance = Angle.FromDegrees(15).Theta;
  10. public bool CanShuttleDock(EntityUid? shuttle)
  11. {
  12. if (shuttle == null)
  13. return false;
  14. return !HasComp<PreventPilotComponent>(shuttle.Value);
  15. }
  16. public bool CanShuttleUndock(EntityUid? shuttle)
  17. {
  18. if (shuttle == null)
  19. return false;
  20. return !HasComp<PreventPilotComponent>(shuttle.Value);
  21. }
  22. public bool CanDock(MapCoordinates mapPosA, Angle worldRotA,
  23. MapCoordinates mapPosB, Angle worldRotB)
  24. {
  25. // Uh oh
  26. if (mapPosA.MapId != mapPosB.MapId)
  27. return false;
  28. return InRange(mapPosA, mapPosB) && InAlignment(mapPosA, worldRotA, mapPosB, worldRotB);
  29. }
  30. public bool InRange(MapCoordinates mapPosA, MapCoordinates mapPosB)
  31. {
  32. return (mapPosA.Position - mapPosB.Position).Length() <= DockRange;
  33. }
  34. public bool InAlignment(MapCoordinates mapPosA, Angle worldRotA, MapCoordinates mapPosB, Angle worldRotB)
  35. {
  36. // Check if the nubs are in line with the two docks.
  37. var worldRotToB = (mapPosB.Position - mapPosA.Position).ToWorldAngle();
  38. var worldRotToA = (mapPosA.Position - mapPosB.Position).ToWorldAngle();
  39. var aDiff = Angle.ShortestDistance((worldRotA - worldRotToB).Reduced(), Angle.Zero);
  40. var bDiff = Angle.ShortestDistance((worldRotB - worldRotToA).Reduced(), Angle.Zero);
  41. if (Math.Abs(aDiff.Theta) > AlignmentTolerance)
  42. return false;
  43. if (Math.Abs(bDiff.Theta) > AlignmentTolerance)
  44. return false;
  45. return true;
  46. }
  47. public bool CanDock(NetCoordinates coordinatesOne, Angle angleOne,
  48. NetCoordinates coordinatesTwo, Angle angleTwo)
  49. {
  50. // TODO: Dump the dock fixtures
  51. var coordsA = GetCoordinates(coordinatesOne);
  52. var coordsB = GetCoordinates(coordinatesTwo);
  53. var mapPosA = XformSystem.ToMapCoordinates(coordsA);
  54. var mapPosB = XformSystem.ToMapCoordinates(coordsB);
  55. var worldRotA = XformSystem.GetWorldRotation(coordsA.EntityId) + angleOne;
  56. var worldRotB = XformSystem.GetWorldRotation(coordsB.EntityId) + angleTwo;
  57. return CanDock(mapPosA, worldRotA, mapPosB, worldRotB);
  58. }
  59. }