CatStation/Content.Client/Maps/GridDraggingSystem.cs
TemporalOroboros 84b2f07157
The IMapManager is dead (#44002)
* Axes the easy IMapManager references

* Axes the references to unported (obsolete) IMapManager methods

* Converts salvageruler command to a LocalizedEntityCommand so it can use SharedMapSystem

* Removes IMapManager from GameTicker
This required axing the map nuke during restart, but that should be fine?
Maps are entities so EntityManager.FlushEntities should delete them all and that's the preceding line

* submodule update(?)

---------

Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
2026-07-01 20:44:54 -07:00

133 lines
4 KiB
C#

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 partial class GridDraggingSystem : SharedGridDraggingSystem
{
[Dependency] private IEyeManager _eyeManager = default!;
[Dependency] private IGameTiming _gameTiming = default!;
[Dependency] private IInputManager _inputManager = default!;
[Dependency] private SharedMapSystem _mapSystem = default!;
[Dependency] private InputSystem _inputSystem = default!;
[Dependency] private 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 (!_mapSystem.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,
});
}
}