| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- using System.Numerics;
- using Content.Shared.Maps;
- using Robust.Client.GameObjects;
- using Robust.Client.Graphics;
- using Robust.Client.Input;
- using Robust.Shared.Input;
- using Robust.Shared.Map;
- using Robust.Shared.Physics.Components;
- using Robust.Shared.Timing;
- namespace Content.Client.Maps;
- /// <inheritdoc />
- public sealed class GridDraggingSystem : SharedGridDraggingSystem
- {
- [Dependency] private readonly IEyeManager _eyeManager = default!;
- [Dependency] private readonly IGameTiming _gameTiming = default!;
- [Dependency] private readonly IInputManager _inputManager = default!;
- [Dependency] private readonly IMapManager _mapManager = default!;
- [Dependency] private readonly InputSystem _inputSystem = default!;
- [Dependency] private readonly SharedTransformSystem _transformSystem = default!;
- public bool Enabled { get; set; }
- private EntityUid? _dragging;
- private Vector2 _localPosition;
- private MapCoordinates? _lastMousePosition;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeNetworkEvent<GridDragToggleMessage>(OnToggleMessage);
- }
- private void OnToggleMessage(GridDragToggleMessage ev)
- {
- if (Enabled == ev.Enabled)
- return;
- Enabled = ev.Enabled;
- if (!Enabled)
- StopDragging();
- }
- private void StartDragging(EntityUid grid, Vector2 localPosition)
- {
- _dragging = grid;
- _localPosition = localPosition;
- if (HasComp<PhysicsComponent>(grid))
- {
- RaiseNetworkEvent(new GridDragVelocityRequest()
- {
- Grid = GetNetEntity(grid),
- LinearVelocity = Vector2.Zero
- });
- }
- }
- private void StopDragging()
- {
- if (_dragging == null) return;
- if (_lastMousePosition != null && TryComp(_dragging.Value, out TransformComponent? xform) &&
- TryComp<PhysicsComponent>(_dragging.Value, out _) &&
- xform.MapID == _lastMousePosition.Value.MapId)
- {
- var tickTime = _gameTiming.TickPeriod;
- var distance = _lastMousePosition.Value.Position - _transformSystem.GetWorldPosition(xform);
- RaiseNetworkEvent(new GridDragVelocityRequest()
- {
- Grid = GetNetEntity(_dragging.Value),
- LinearVelocity = distance.LengthSquared() > 0f ? (distance / (float) tickTime.TotalSeconds) * 0.25f : Vector2.Zero,
- });
- }
- _dragging = null;
- _localPosition = Vector2.Zero;
- _lastMousePosition = null;
- }
- public override void Update(float frameTime)
- {
- base.Update(frameTime);
- if (!Enabled || !_gameTiming.IsFirstTimePredicted) return;
- var state = _inputSystem.CmdStates.GetState(EngineKeyFunctions.Use);
- if (state != BoundKeyState.Down)
- {
- StopDragging();
- return;
- }
- var mouseScreenPos = _inputManager.MouseScreenPosition;
- var mousePos = _eyeManager.PixelToMap(mouseScreenPos);
- if (_dragging == null)
- {
- if (!_mapManager.TryFindGridAt(mousePos, out var gridUid, out var grid))
- return;
- StartDragging(gridUid, Vector2.Transform(mousePos.Position, _transformSystem.GetInvWorldMatrix(gridUid)));
- }
- if (!TryComp(_dragging, out TransformComponent? xform))
- {
- StopDragging();
- return;
- }
- if (xform.MapID != mousePos.MapId)
- {
- StopDragging();
- return;
- }
- var localToWorld = Vector2.Transform(_localPosition, _transformSystem.GetWorldMatrix(xform));
- if (localToWorld.EqualsApprox(mousePos.Position, 0.01f)) return;
- var requestedGridOrigin = mousePos.Position - _transformSystem.GetWorldRotation(xform).RotateVec(_localPosition);
- _lastMousePosition = new MapCoordinates(requestedGridOrigin, mousePos.MapId);
- RaiseNetworkEvent(new GridDragRequestPosition()
- {
- Grid = GetNetEntity(_dragging.Value),
- WorldPosition = requestedGridOrigin,
- });
- }
- }
|