GridDraggingSystem.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using Content.Shared.Maps;
  2. using Robust.Server.Console;
  3. using Robust.Shared.Utility;
  4. using Robust.Shared.Physics.Components;
  5. using Robust.Shared.Physics.Systems;
  6. using Robust.Shared.Player;
  7. namespace Content.Server.Maps;
  8. /// <inheritdoc />
  9. public sealed class GridDraggingSystem : SharedGridDraggingSystem
  10. {
  11. [Dependency] private readonly IConGroupController _admin = default!;
  12. [Dependency] private readonly SharedPhysicsSystem _physics = default!;
  13. [Dependency] private readonly SharedTransformSystem _transformSystem = default!;
  14. private readonly HashSet<ICommonSession> _draggers = new();
  15. public override void Initialize()
  16. {
  17. base.Initialize();
  18. SubscribeNetworkEvent<GridDragRequestPosition>(OnRequestDrag);
  19. SubscribeNetworkEvent<GridDragVelocityRequest>(OnRequestVelocity);
  20. }
  21. public bool IsEnabled(ICommonSession session) => _draggers.Contains(session);
  22. public void Toggle(ICommonSession session)
  23. {
  24. if (session is not { } pSession)
  25. return;
  26. DebugTools.Assert(_admin.CanCommand(pSession, CommandName));
  27. // Weird but it's a toggle
  28. if (_draggers.Add(session))
  29. {
  30. }
  31. else
  32. {
  33. _draggers.Remove(session);
  34. }
  35. RaiseNetworkEvent(new GridDragToggleMessage()
  36. {
  37. Enabled = _draggers.Contains(session),
  38. }, session.Channel);
  39. }
  40. private void OnRequestVelocity(GridDragVelocityRequest ev, EntitySessionEventArgs args)
  41. {
  42. var grid = GetEntity(ev.Grid);
  43. if (args.SenderSession is not { } playerSession ||
  44. !_admin.CanCommand(playerSession, CommandName) ||
  45. !Exists(grid) ||
  46. Deleted(grid))
  47. {
  48. return;
  49. }
  50. var gridBody = Comp<PhysicsComponent>(grid);
  51. _physics.SetLinearVelocity(grid, ev.LinearVelocity, body: gridBody);
  52. _physics.SetAngularVelocity(grid, 0f, body: gridBody);
  53. }
  54. private void OnRequestDrag(GridDragRequestPosition msg, EntitySessionEventArgs args)
  55. {
  56. var grid = GetEntity(msg.Grid);
  57. if (args.SenderSession is not { } playerSession ||
  58. !_admin.CanCommand(playerSession, CommandName) ||
  59. !Exists(grid) ||
  60. Deleted(grid))
  61. {
  62. return;
  63. }
  64. _transformSystem.SetWorldPosition(grid, msg.WorldPosition);
  65. }
  66. }