GridDraggingSystem.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System.Numerics;
  2. using Content.Shared.Maps;
  3. using Robust.Client.GameObjects;
  4. using Robust.Client.Graphics;
  5. using Robust.Client.Input;
  6. using Robust.Shared.Input;
  7. using Robust.Shared.Map;
  8. using Robust.Shared.Physics.Components;
  9. using Robust.Shared.Timing;
  10. namespace Content.Client.Maps;
  11. /// <inheritdoc />
  12. public sealed class GridDraggingSystem : SharedGridDraggingSystem
  13. {
  14. [Dependency] private readonly IEyeManager _eyeManager = default!;
  15. [Dependency] private readonly IGameTiming _gameTiming = default!;
  16. [Dependency] private readonly IInputManager _inputManager = default!;
  17. [Dependency] private readonly IMapManager _mapManager = default!;
  18. [Dependency] private readonly InputSystem _inputSystem = default!;
  19. [Dependency] private readonly SharedTransformSystem _transformSystem = default!;
  20. public bool Enabled { get; set; }
  21. private EntityUid? _dragging;
  22. private Vector2 _localPosition;
  23. private MapCoordinates? _lastMousePosition;
  24. public override void Initialize()
  25. {
  26. base.Initialize();
  27. SubscribeNetworkEvent<GridDragToggleMessage>(OnToggleMessage);
  28. }
  29. private void OnToggleMessage(GridDragToggleMessage ev)
  30. {
  31. if (Enabled == ev.Enabled)
  32. return;
  33. Enabled = ev.Enabled;
  34. if (!Enabled)
  35. StopDragging();
  36. }
  37. private void StartDragging(EntityUid grid, Vector2 localPosition)
  38. {
  39. _dragging = grid;
  40. _localPosition = localPosition;
  41. if (HasComp<PhysicsComponent>(grid))
  42. {
  43. RaiseNetworkEvent(new GridDragVelocityRequest()
  44. {
  45. Grid = GetNetEntity(grid),
  46. LinearVelocity = Vector2.Zero
  47. });
  48. }
  49. }
  50. private void StopDragging()
  51. {
  52. if (_dragging == null) return;
  53. if (_lastMousePosition != null && TryComp(_dragging.Value, out TransformComponent? xform) &&
  54. TryComp<PhysicsComponent>(_dragging.Value, out _) &&
  55. xform.MapID == _lastMousePosition.Value.MapId)
  56. {
  57. var tickTime = _gameTiming.TickPeriod;
  58. var distance = _lastMousePosition.Value.Position - _transformSystem.GetWorldPosition(xform);
  59. RaiseNetworkEvent(new GridDragVelocityRequest()
  60. {
  61. Grid = GetNetEntity(_dragging.Value),
  62. LinearVelocity = distance.LengthSquared() > 0f ? (distance / (float) tickTime.TotalSeconds) * 0.25f : Vector2.Zero,
  63. });
  64. }
  65. _dragging = null;
  66. _localPosition = Vector2.Zero;
  67. _lastMousePosition = null;
  68. }
  69. public override void Update(float frameTime)
  70. {
  71. base.Update(frameTime);
  72. if (!Enabled || !_gameTiming.IsFirstTimePredicted) return;
  73. var state = _inputSystem.CmdStates.GetState(EngineKeyFunctions.Use);
  74. if (state != BoundKeyState.Down)
  75. {
  76. StopDragging();
  77. return;
  78. }
  79. var mouseScreenPos = _inputManager.MouseScreenPosition;
  80. var mousePos = _eyeManager.PixelToMap(mouseScreenPos);
  81. if (_dragging == null)
  82. {
  83. if (!_mapManager.TryFindGridAt(mousePos, out var gridUid, out var grid))
  84. return;
  85. StartDragging(gridUid, Vector2.Transform(mousePos.Position, _transformSystem.GetInvWorldMatrix(gridUid)));
  86. }
  87. if (!TryComp(_dragging, out TransformComponent? xform))
  88. {
  89. StopDragging();
  90. return;
  91. }
  92. if (xform.MapID != mousePos.MapId)
  93. {
  94. StopDragging();
  95. return;
  96. }
  97. var localToWorld = Vector2.Transform(_localPosition, _transformSystem.GetWorldMatrix(xform));
  98. if (localToWorld.EqualsApprox(mousePos.Position, 0.01f)) return;
  99. var requestedGridOrigin = mousePos.Position - _transformSystem.GetWorldRotation(xform).RotateVec(_localPosition);
  100. _lastMousePosition = new MapCoordinates(requestedGridOrigin, mousePos.MapId);
  101. RaiseNetworkEvent(new GridDragRequestPosition()
  102. {
  103. Grid = GetNetEntity(_dragging.Value),
  104. WorldPosition = requestedGridOrigin,
  105. });
  106. }
  107. }