RankSystem.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Content.Server.Players.PlayTimeTracking;
  2. using Content.Shared._RMC14.Marines.Roles.Ranks;
  3. using Content.Shared.Chat;
  4. using Content.Shared.GameTicking;
  5. using Content.Shared.Roles;
  6. using Robust.Shared.Prototypes;
  7. namespace Content.Server._RMC14.Marines.Roles.Ranks;
  8. public sealed class RankSystem : SharedRankSystem
  9. {
  10. [Dependency] private readonly PlayTimeTrackingManager _tracking = default!;
  11. [Dependency] private readonly IPrototypeManager _prototypes = default!;
  12. [Dependency] private readonly IEntityManager _entityManager = default!;
  13. public override void Initialize()
  14. {
  15. base.Initialize();
  16. SubscribeLocalEvent<RankComponent, TransformSpeakerNameEvent>(OnSpeakerNameTransform);
  17. SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnPlayerSpawnComplete);
  18. }
  19. private void OnSpeakerNameTransform(Entity<RankComponent> ent, ref TransformSpeakerNameEvent args)
  20. {
  21. var name = GetSpeakerRankName(ent);
  22. if (name == null)
  23. return;
  24. args.VoiceName = name;
  25. }
  26. private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent ev)
  27. {
  28. if (ev.JobId == null)
  29. return;
  30. if (!_prototypes.TryIndex<JobPrototype>(ev.JobId, out var jobPrototype))
  31. return;
  32. if (jobPrototype.Ranks == null)
  33. return;
  34. if (!_tracking.TryGetTrackerTimes(ev.Player, out var playTimes))
  35. {
  36. // Playtimes haven't loaded.
  37. Log.Error($"Playtimes weren't ready yet for {ev.Player} on roundstart!");
  38. playTimes ??= new Dictionary<string, TimeSpan>();
  39. }
  40. foreach (var rank in jobPrototype.Ranks)
  41. {
  42. var failed = false;
  43. var jobRequirements = rank.Value;
  44. if (_prototypes.TryIndex<RankPrototype>(rank.Key, out var rankPrototype) && rankPrototype != null)
  45. {
  46. if (jobRequirements != null)
  47. {
  48. foreach (var req in jobRequirements)
  49. {
  50. if (!req.Check(_entityManager, _prototypes, ev.Profile, playTimes, out _))
  51. failed = true;
  52. }
  53. }
  54. if (!failed)
  55. {
  56. SetRank(ev.Mob, rankPrototype);
  57. break;
  58. }
  59. }
  60. }
  61. }
  62. }