1
0

SharedTrayScannerSystem.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using Content.Shared.Eye;
  2. using Content.Shared.Hands;
  3. using Content.Shared.Interaction;
  4. using Content.Shared.Inventory.Events;
  5. using Robust.Shared.GameStates;
  6. using Robust.Shared.Serialization;
  7. namespace Content.Shared.SubFloor;
  8. public abstract class SharedTrayScannerSystem : EntitySystem
  9. {
  10. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  11. [Dependency] private readonly SharedEyeSystem _eye = default!;
  12. public const float SubfloorRevealAlpha = 0.8f;
  13. public override void Initialize()
  14. {
  15. base.Initialize();
  16. SubscribeLocalEvent<TrayScannerComponent, ComponentGetState>(OnTrayScannerGetState);
  17. SubscribeLocalEvent<TrayScannerComponent, ComponentHandleState>(OnTrayScannerHandleState);
  18. SubscribeLocalEvent<TrayScannerComponent, ActivateInWorldEvent>(OnTrayScannerActivate);
  19. SubscribeLocalEvent<TrayScannerComponent, GotEquippedHandEvent>(OnTrayHandEquipped);
  20. SubscribeLocalEvent<TrayScannerComponent, GotUnequippedHandEvent>(OnTrayHandUnequipped);
  21. SubscribeLocalEvent<TrayScannerComponent, GotEquippedEvent>(OnTrayEquipped);
  22. SubscribeLocalEvent<TrayScannerComponent, GotUnequippedEvent>(OnTrayUnequipped);
  23. SubscribeLocalEvent<TrayScannerUserComponent, GetVisMaskEvent>(OnUserGetVis);
  24. }
  25. private void OnUserGetVis(Entity<TrayScannerUserComponent> ent, ref GetVisMaskEvent args)
  26. {
  27. args.VisibilityMask |= (int)VisibilityFlags.Subfloor;
  28. }
  29. private void OnEquip(EntityUid user)
  30. {
  31. EnsureComp<TrayScannerUserComponent>(user);
  32. _eye.RefreshVisibilityMask(user);
  33. }
  34. private void OnUnequip(EntityUid user)
  35. {
  36. RemComp<TrayScannerUserComponent>(user);
  37. _eye.RefreshVisibilityMask(user);
  38. }
  39. private void OnTrayHandUnequipped(Entity<TrayScannerComponent> ent, ref GotUnequippedHandEvent args)
  40. {
  41. OnUnequip(args.User);
  42. }
  43. private void OnTrayHandEquipped(Entity<TrayScannerComponent> ent, ref GotEquippedHandEvent args)
  44. {
  45. OnEquip(args.User);
  46. }
  47. private void OnTrayUnequipped(Entity<TrayScannerComponent> ent, ref GotUnequippedEvent args)
  48. {
  49. OnUnequip(args.Equipee);
  50. }
  51. private void OnTrayEquipped(Entity<TrayScannerComponent> ent, ref GotEquippedEvent args)
  52. {
  53. OnEquip(args.Equipee);
  54. }
  55. private void OnTrayScannerActivate(EntityUid uid, TrayScannerComponent scanner, ActivateInWorldEvent args)
  56. {
  57. if (args.Handled || !args.Complex)
  58. return;
  59. SetScannerEnabled(uid, !scanner.Enabled, scanner);
  60. args.Handled = true;
  61. }
  62. private void SetScannerEnabled(EntityUid uid, bool enabled, TrayScannerComponent? scanner = null)
  63. {
  64. if (!Resolve(uid, ref scanner) || scanner.Enabled == enabled)
  65. return;
  66. scanner.Enabled = enabled;
  67. Dirty(uid, scanner);
  68. // We don't remove from _activeScanners on disabled, because the update function will handle that, as well as
  69. // managing the revealed subfloor entities
  70. if (TryComp<AppearanceComponent>(uid, out var appearance))
  71. {
  72. _appearance.SetData(uid, TrayScannerVisual.Visual, scanner.Enabled ? TrayScannerVisual.On : TrayScannerVisual.Off, appearance);
  73. }
  74. }
  75. private void OnTrayScannerGetState(EntityUid uid, TrayScannerComponent scanner, ref ComponentGetState args)
  76. {
  77. args.State = new TrayScannerState(scanner.Enabled, scanner.Range);
  78. }
  79. private void OnTrayScannerHandleState(EntityUid uid, TrayScannerComponent scanner, ref ComponentHandleState args)
  80. {
  81. if (args.Current is not TrayScannerState state)
  82. return;
  83. scanner.Range = state.Range;
  84. SetScannerEnabled(uid, state.Enabled, scanner);
  85. }
  86. }
  87. [Serializable, NetSerializable]
  88. public enum TrayScannerVisual : sbyte
  89. {
  90. Visual,
  91. On,
  92. Off
  93. }