ResearchSystem.Console.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using Content.Server.Power.EntitySystems;
  2. using Content.Server.Research.Components;
  3. using Content.Shared.UserInterface;
  4. using Content.Shared.Access.Components;
  5. using Content.Shared.Emag.Components;
  6. using Content.Shared.Emag.Systems;
  7. using Content.Shared.IdentityManagement;
  8. using Content.Shared.Research.Components;
  9. using Content.Shared.Research.Prototypes;
  10. namespace Content.Server.Research.Systems;
  11. public sealed partial class ResearchSystem
  12. {
  13. [Dependency] private readonly EmagSystem _emag = default!;
  14. private void InitializeConsole()
  15. {
  16. SubscribeLocalEvent<ResearchConsoleComponent, ConsoleUnlockTechnologyMessage>(OnConsoleUnlock);
  17. SubscribeLocalEvent<ResearchConsoleComponent, BeforeActivatableUIOpenEvent>(OnConsoleBeforeUiOpened);
  18. SubscribeLocalEvent<ResearchConsoleComponent, ResearchServerPointsChangedEvent>(OnPointsChanged);
  19. SubscribeLocalEvent<ResearchConsoleComponent, ResearchRegistrationChangedEvent>(OnConsoleRegistrationChanged);
  20. SubscribeLocalEvent<ResearchConsoleComponent, TechnologyDatabaseModifiedEvent>(OnConsoleDatabaseModified);
  21. SubscribeLocalEvent<ResearchConsoleComponent, TechnologyDatabaseSynchronizedEvent>(OnConsoleDatabaseSynchronized);
  22. SubscribeLocalEvent<ResearchConsoleComponent, GotEmaggedEvent>(OnEmagged);
  23. }
  24. private void OnConsoleUnlock(EntityUid uid, ResearchConsoleComponent component, ConsoleUnlockTechnologyMessage args)
  25. {
  26. var act = args.Actor;
  27. if (!this.IsPowered(uid, EntityManager))
  28. return;
  29. if (!PrototypeManager.TryIndex<TechnologyPrototype>(args.Id, out var technologyPrototype))
  30. return;
  31. if (TryComp<AccessReaderComponent>(uid, out var access) && !_accessReader.IsAllowed(act, uid, access))
  32. {
  33. _popup.PopupEntity(Loc.GetString("research-console-no-access-popup"), act);
  34. return;
  35. }
  36. if (!UnlockTechnology(uid, args.Id, act))
  37. return;
  38. if (!_emag.CheckFlag(uid, EmagType.Interaction))
  39. {
  40. var getIdentityEvent = new TryGetIdentityShortInfoEvent(uid, act);
  41. RaiseLocalEvent(getIdentityEvent);
  42. var message = Loc.GetString(
  43. "research-console-unlock-technology-radio-broadcast",
  44. ("technology", Loc.GetString(technologyPrototype.Name)),
  45. ("amount", technologyPrototype.Cost),
  46. ("approver", getIdentityEvent.Title ?? string.Empty)
  47. );
  48. _radio.SendRadioMessage(uid, message, component.AnnouncementChannel, uid, escapeMarkup: false);
  49. }
  50. SyncClientWithServer(uid);
  51. UpdateConsoleInterface(uid, component);
  52. }
  53. private void OnConsoleBeforeUiOpened(EntityUid uid, ResearchConsoleComponent component, BeforeActivatableUIOpenEvent args)
  54. {
  55. SyncClientWithServer(uid);
  56. }
  57. private void UpdateConsoleInterface(EntityUid uid, ResearchConsoleComponent? component = null, ResearchClientComponent? clientComponent = null)
  58. {
  59. if (!Resolve(uid, ref component, ref clientComponent, false))
  60. return;
  61. ResearchConsoleBoundInterfaceState state;
  62. if (TryGetClientServer(uid, out _, out var serverComponent, clientComponent))
  63. {
  64. var points = clientComponent.ConnectedToServer ? serverComponent.Points : 0;
  65. state = new ResearchConsoleBoundInterfaceState(points);
  66. }
  67. else
  68. {
  69. state = new ResearchConsoleBoundInterfaceState(default);
  70. }
  71. _uiSystem.SetUiState(uid, ResearchConsoleUiKey.Key, state);
  72. }
  73. private void OnPointsChanged(EntityUid uid, ResearchConsoleComponent component, ref ResearchServerPointsChangedEvent args)
  74. {
  75. if (!_uiSystem.IsUiOpen(uid, ResearchConsoleUiKey.Key))
  76. return;
  77. UpdateConsoleInterface(uid, component);
  78. }
  79. private void OnConsoleRegistrationChanged(EntityUid uid, ResearchConsoleComponent component, ref ResearchRegistrationChangedEvent args)
  80. {
  81. SyncClientWithServer(uid);
  82. UpdateConsoleInterface(uid, component);
  83. }
  84. private void OnConsoleDatabaseModified(EntityUid uid, ResearchConsoleComponent component, ref TechnologyDatabaseModifiedEvent args)
  85. {
  86. SyncClientWithServer(uid);
  87. UpdateConsoleInterface(uid, component);
  88. }
  89. private void OnConsoleDatabaseSynchronized(EntityUid uid, ResearchConsoleComponent component, ref TechnologyDatabaseSynchronizedEvent args)
  90. {
  91. UpdateConsoleInterface(uid, component);
  92. }
  93. private void OnEmagged(Entity<ResearchConsoleComponent> ent, ref GotEmaggedEvent args)
  94. {
  95. if (!_emag.CompareFlag(args.Type, EmagType.Interaction))
  96. return;
  97. if (_emag.CheckFlag(ent, EmagType.Interaction))
  98. return;
  99. args.Handled = true;
  100. }
  101. }