SharedRankSystem.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using Content.Shared.Examine;
  2. using Content.Shared.Humanoid;
  3. using Robust.Shared.Enums;
  4. using Robust.Shared.Prototypes;
  5. namespace Content.Shared._RMC14.Marines.Roles.Ranks;
  6. public abstract class SharedRankSystem : EntitySystem
  7. {
  8. [Dependency] private readonly IPrototypeManager _prototypes = default!;
  9. public override void Initialize()
  10. {
  11. base.Initialize();
  12. SubscribeLocalEvent<RankComponent, ExaminedEvent>(OnRankExamined);
  13. }
  14. private void OnRankExamined(Entity<RankComponent> ent, ref ExaminedEvent args)
  15. {
  16. using (args.PushGroup(nameof(SharedRankSystem), 1))
  17. {
  18. var user = ent.Owner;
  19. var rank = GetRankString(user, hasPaygrade: true);
  20. if (rank != null)
  21. {
  22. var finalString = Loc.GetString("rmc-rank-component-examine", ("user", user), ("rank", rank));
  23. args.PushMarkup(finalString);
  24. }
  25. }
  26. }
  27. /// <summary>
  28. /// Sets a mob's rank from the given RankPrototype.
  29. /// </summary>
  30. public void SetRank(EntityUid uid, RankPrototype from)
  31. {
  32. SetRank(uid, from.ID);
  33. }
  34. /// <summary>
  35. /// Sets a mob's rank from the given RankPrototype.
  36. /// </summary>
  37. public void SetRank(EntityUid uid, ProtoId<RankPrototype> from)
  38. {
  39. var comp = EnsureComp<RankComponent>(uid);
  40. comp.Rank = from;
  41. Dirty(uid, comp);
  42. }
  43. /// <summary>
  44. /// Gets the rank of a given mob.
  45. /// </summary>
  46. public RankPrototype? GetRank(EntityUid uid)
  47. {
  48. if (TryComp<RankComponent>(uid, out var component))
  49. return GetRank(component);
  50. return null;
  51. }
  52. /// <summary>
  53. /// Gets a RankPrototype from a RankComponent.
  54. /// </summary>
  55. public RankPrototype? GetRank(RankComponent component)
  56. {
  57. if (_prototypes.TryIndex<RankPrototype>(component.Rank, out var rankProto) && rankProto != null)
  58. return rankProto;
  59. return null;
  60. }
  61. /// <summary>
  62. /// Gets the rank name of a given mob.
  63. /// </summary>
  64. public string? GetRankString(EntityUid uid, bool isShort = false, bool hasPaygrade = false)
  65. {
  66. var rank = GetRank(uid);
  67. if (rank == null)
  68. return null;
  69. if (isShort)
  70. {
  71. if (rank.FemalePrefix == null || rank.MalePrefix == null)
  72. return rank.Prefix;
  73. if (!TryComp<HumanoidAppearanceComponent>(uid, out var humanoidAppearance))
  74. return rank.Prefix;
  75. var genderPrefix = humanoidAppearance.Gender switch
  76. {
  77. Gender.Female => rank.FemalePrefix,
  78. Gender.Male => rank.MalePrefix,
  79. Gender.Epicene or Gender.Neuter or _ => rank.Prefix
  80. };
  81. return genderPrefix;
  82. }
  83. else if (hasPaygrade && rank.Paygrade != null)
  84. {
  85. return "(" + rank.Paygrade + ")" + " " + rank.Name;
  86. }
  87. else
  88. {
  89. return rank.Name;
  90. }
  91. }
  92. /// <summary>
  93. /// Gets the prefix rank name. (ex. Maj John Marine)
  94. /// </summary>
  95. public string? GetSpeakerRankName(EntityUid uid)
  96. {
  97. var rank = GetRankString(uid, true);
  98. if (rank == null)
  99. return null;
  100. return rank + " " + Name(uid);
  101. }
  102. /// <summary>
  103. /// Gets the prefix full name. (ex. Major John Marine)
  104. /// </summary>
  105. public string? GetSpeakerFullRankName(EntityUid uid)
  106. {
  107. var rank = GetRankString(uid);
  108. if (rank == null)
  109. return null;
  110. return rank + " " + Name(uid);
  111. }
  112. }