CrewManifestCartridgeSystem.cs 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Content.Server.CrewManifest;
  2. using Content.Server.Station.Systems;
  3. using Content.Shared.CartridgeLoader;
  4. using Content.Shared.CartridgeLoader.Cartridges;
  5. using Content.Shared.CCVar;
  6. using Robust.Shared.Configuration;
  7. using Robust.Shared.Containers;
  8. using Robust.Shared.Prototypes;
  9. namespace Content.Server.CartridgeLoader.Cartridges;
  10. public sealed class CrewManifestCartridgeSystem : EntitySystem
  11. {
  12. [Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!;
  13. [Dependency] private readonly IConfigurationManager _configManager = default!;
  14. [Dependency] private readonly CrewManifestSystem _crewManifest = default!;
  15. [Dependency] private readonly StationSystem _stationSystem = default!;
  16. [ValidatePrototypeId<EntityPrototype>]
  17. private const string CartridgePrototypeName = "CrewManifestCartridge";
  18. /// <summary>
  19. /// Flag that shows that if crew manifest is allowed to be viewed from 'unsecure' entities,
  20. /// which is the keys for the cartridge.
  21. /// </summary>
  22. private bool _unsecureViewersAllowed = true;
  23. public override void Initialize()
  24. {
  25. base.Initialize();
  26. SubscribeLocalEvent<CrewManifestCartridgeComponent, CartridgeMessageEvent>(OnUiMessage);
  27. SubscribeLocalEvent<CrewManifestCartridgeComponent, CartridgeUiReadyEvent>(OnUiReady);
  28. SubscribeLocalEvent<ProgramInstallationAttempt>(OnInstallationAttempt);
  29. Subs.CVar(_configManager, CCVars.CrewManifestUnsecure, OnCrewManifestUnsecureChanged, true);
  30. }
  31. /// <summary>
  32. /// The ui messages received here get wrapped by a CartridgeMessageEvent and are relayed from the <see cref="CartridgeLoaderSystem"/>
  33. /// </summary>
  34. /// <remarks>
  35. /// The cartridge specific ui message event needs to inherit from the CartridgeMessageEvent
  36. /// </remarks>
  37. private void OnUiMessage(EntityUid uid, CrewManifestCartridgeComponent component, CartridgeMessageEvent args)
  38. {
  39. UpdateUiState(uid, GetEntity(args.LoaderUid), component);
  40. }
  41. /// <summary>
  42. /// This gets called when the ui fragment needs to be updated for the first time after activating
  43. /// </summary>
  44. private void OnUiReady(EntityUid uid, CrewManifestCartridgeComponent component, CartridgeUiReadyEvent args)
  45. {
  46. UpdateUiState(uid, args.Loader, component);
  47. }
  48. private void UpdateUiState(EntityUid uid, EntityUid loaderUid, CrewManifestCartridgeComponent? component)
  49. {
  50. if (!Resolve(uid, ref component))
  51. return;
  52. var owningStation = _stationSystem.GetOwningStation(uid);
  53. if (owningStation is null)
  54. return;
  55. var (stationName, entries) = _crewManifest.GetCrewManifest(owningStation.Value);
  56. var state = new CrewManifestUiState(stationName, entries);
  57. _cartridgeLoader.UpdateCartridgeUiState(loaderUid, state);
  58. }
  59. private void OnInstallationAttempt(ref ProgramInstallationAttempt args)
  60. {
  61. if (args.Prototype == CartridgePrototypeName && !_unsecureViewersAllowed)
  62. args.Cancelled = true;
  63. }
  64. private void OnCrewManifestUnsecureChanged(bool unsecureViewersAllowed)
  65. {
  66. _unsecureViewersAllowed = unsecureViewersAllowed;
  67. var allCartridgeLoaders = AllEntityQuery<CartridgeLoaderComponent, ContainerManagerComponent>();
  68. while (allCartridgeLoaders.MoveNext(out var loaderUid, out var comp, out var cont))
  69. {
  70. if (_unsecureViewersAllowed)
  71. {
  72. _cartridgeLoader.InstallProgram(loaderUid, CartridgePrototypeName, false, comp);
  73. return;
  74. }
  75. if (_cartridgeLoader.TryGetProgram<CrewManifestCartridgeComponent>(loaderUid, out var program, true, comp, cont))
  76. _cartridgeLoader.UninstallProgram(loaderUid, program.Value, comp);
  77. }
  78. }
  79. }