TraitorCodePaperSystem.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System.Diagnostics.CodeAnalysis;
  2. using Content.Server.GameTicking;
  3. using Content.Server.GameTicking.Rules;
  4. using Content.Server.GameTicking.Rules.Components;
  5. using Content.Server.Paper;
  6. using Content.Server.Traitor.Components;
  7. using Robust.Shared.Random;
  8. using Robust.Shared.Utility;
  9. using System.Linq;
  10. using Content.Shared.Paper;
  11. namespace Content.Server.Traitor.Systems;
  12. public sealed class TraitorCodePaperSystem : EntitySystem
  13. {
  14. [Dependency] private readonly GameTicker _gameTicker = default!;
  15. [Dependency] private readonly TraitorRuleSystem _traitorRuleSystem = default!;
  16. [Dependency] private readonly IRobustRandom _random = default!;
  17. [Dependency] private readonly PaperSystem _paper = default!;
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<TraitorCodePaperComponent, MapInitEvent>(OnMapInit);
  22. }
  23. private void OnMapInit(EntityUid uid, TraitorCodePaperComponent component, MapInitEvent args)
  24. {
  25. SetupPaper(uid, component);
  26. }
  27. private void SetupPaper(EntityUid uid, TraitorCodePaperComponent? component = null)
  28. {
  29. if (!Resolve(uid, ref component))
  30. return;
  31. if (TryComp(uid, out PaperComponent? paperComp))
  32. {
  33. if (TryGetTraitorCode(out var paperContent, component))
  34. {
  35. _paper.SetContent((uid, paperComp), paperContent);
  36. }
  37. }
  38. }
  39. private bool TryGetTraitorCode([NotNullWhen(true)] out string? traitorCode, TraitorCodePaperComponent component)
  40. {
  41. traitorCode = null;
  42. var codesMessage = new FormattedMessage();
  43. List<string> codeList = new();
  44. // Find the first nuke that matches the passed location.
  45. if (_gameTicker.IsGameRuleAdded<TraitorRuleComponent>())
  46. {
  47. var ruleEnts = _gameTicker.GetAddedGameRules();
  48. foreach (var ruleEnt in ruleEnts)
  49. {
  50. if (TryComp(ruleEnt, out TraitorRuleComponent? traitorComp))
  51. {
  52. codeList.AddRange(traitorComp.Codewords.ToList());
  53. }
  54. }
  55. }
  56. if (codeList.Count == 0)
  57. {
  58. if (component.FakeCodewords)
  59. codeList = _traitorRuleSystem.GenerateTraitorCodewords(new TraitorRuleComponent()).ToList();
  60. else
  61. codeList = [Loc.GetString("traitor-codes-none")];
  62. }
  63. _random.Shuffle(codeList);
  64. int i = 0;
  65. foreach (var code in codeList)
  66. {
  67. i++;
  68. if (i > component.CodewordAmount && !component.CodewordShowAll)
  69. break;
  70. codesMessage.PushNewline();
  71. codesMessage.AddMarkupOrThrow(code);
  72. }
  73. if (!codesMessage.IsEmpty)
  74. {
  75. if (i == 1)
  76. traitorCode = Loc.GetString("traitor-codes-message-singular") + codesMessage;
  77. else
  78. traitorCode = Loc.GetString("traitor-codes-message-plural") + codesMessage;
  79. }
  80. return !codesMessage.IsEmpty;
  81. }
  82. }