1
0

TargetingSystem.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // SPDX-FileCopyrightText: 2024 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
  2. // SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
  3. //
  4. // SPDX-License-Identifier: AGPL-3.0-or-later
  5. using Content.Shared.Input;
  6. using Content.Shared._Shitmed.Targeting;
  7. using Content.Shared._Shitmed.Targeting.Events;
  8. using Robust.Client.Player;
  9. using Robust.Shared.Input.Binding;
  10. using Robust.Shared.Player;
  11. namespace Content.Client._Shitmed.Targeting;
  12. public sealed class TargetingSystem : SharedTargetingSystem
  13. {
  14. [Dependency] private readonly IPlayerManager _playerManager = default!;
  15. public event Action<TargetingComponent>? TargetingStartup;
  16. public event Action? TargetingShutdown;
  17. public event Action<TargetBodyPart>? TargetChange;
  18. public event Action<TargetingComponent>? PartStatusStartup;
  19. public event Action<TargetingComponent>? PartStatusUpdate;
  20. public event Action? PartStatusShutdown;
  21. public override void Initialize()
  22. {
  23. base.Initialize();
  24. SubscribeLocalEvent<TargetingComponent, LocalPlayerAttachedEvent>(HandlePlayerAttached);
  25. SubscribeLocalEvent<TargetingComponent, LocalPlayerDetachedEvent>(HandlePlayerDetached);
  26. SubscribeLocalEvent<TargetingComponent, ComponentStartup>(OnTargetingStartup);
  27. SubscribeLocalEvent<TargetingComponent, ComponentShutdown>(OnTargetingShutdown);
  28. SubscribeNetworkEvent<TargetIntegrityChangeEvent>(OnTargetIntegrityChange);
  29. CommandBinds.Builder
  30. .Bind(ContentKeyFunctions.TargetHead,
  31. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.Head)))
  32. .Bind(ContentKeyFunctions.TargetTorso,
  33. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.Torso)))
  34. .Bind(ContentKeyFunctions.TargetLeftArm,
  35. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftArm)))
  36. .Bind(ContentKeyFunctions.TargetLeftHand,
  37. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftHand)))
  38. .Bind(ContentKeyFunctions.TargetRightArm,
  39. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightArm)))
  40. .Bind(ContentKeyFunctions.TargetRightHand,
  41. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightHand)))
  42. .Bind(ContentKeyFunctions.TargetLeftLeg,
  43. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftLeg)))
  44. .Bind(ContentKeyFunctions.TargetLeftFoot,
  45. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftFoot)))
  46. .Bind(ContentKeyFunctions.TargetRightLeg,
  47. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightLeg)))
  48. .Bind(ContentKeyFunctions.TargetRightFoot,
  49. InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightFoot)))
  50. .Register<SharedTargetingSystem>();
  51. }
  52. private void HandlePlayerAttached(EntityUid uid, TargetingComponent component, LocalPlayerAttachedEvent args)
  53. {
  54. TargetingStartup?.Invoke(component);
  55. PartStatusStartup?.Invoke(component);
  56. }
  57. private void HandlePlayerDetached(EntityUid uid, TargetingComponent component, LocalPlayerDetachedEvent args)
  58. {
  59. TargetingShutdown?.Invoke();
  60. PartStatusShutdown?.Invoke();
  61. }
  62. private void OnTargetingStartup(EntityUid uid, TargetingComponent component, ComponentStartup args)
  63. {
  64. if (_playerManager.LocalEntity != uid)
  65. return;
  66. TargetingStartup?.Invoke(component);
  67. PartStatusStartup?.Invoke(component);
  68. }
  69. private void OnTargetingShutdown(EntityUid uid, TargetingComponent component, ComponentShutdown args)
  70. {
  71. if (_playerManager.LocalEntity != uid)
  72. return;
  73. TargetingShutdown?.Invoke();
  74. PartStatusShutdown?.Invoke();
  75. }
  76. private void OnTargetIntegrityChange(TargetIntegrityChangeEvent args)
  77. {
  78. if (!TryGetEntity(args.Uid, out var uid)
  79. || !_playerManager.LocalEntity.Equals(uid)
  80. || !TryComp(uid, out TargetingComponent? component)
  81. || !args.RefreshUi)
  82. return;
  83. PartStatusUpdate?.Invoke(component);
  84. }
  85. private void HandleTargetChange(ICommonSession? session, TargetBodyPart target)
  86. {
  87. if (session == null
  88. || session.AttachedEntity is not { } uid
  89. || !TryComp<TargetingComponent>(uid, out var targeting))
  90. return;
  91. TargetChange?.Invoke(target);
  92. }
  93. }