AdminSystem.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System.Linq;
  2. using Content.Shared.Administration;
  3. using Content.Shared.Administration.Events;
  4. using Content.Shared.GameTicking;
  5. using Robust.Shared.Network;
  6. namespace Content.Client.Administration.Systems
  7. {
  8. public sealed partial class AdminSystem : EntitySystem
  9. {
  10. public event Action<List<PlayerInfo>>? PlayerListChanged;
  11. private Dictionary<NetUserId, PlayerInfo>? _playerList;
  12. public IReadOnlyList<PlayerInfo> PlayerList
  13. {
  14. get
  15. {
  16. if (_playerList != null) return _playerList.Values.ToList();
  17. return new List<PlayerInfo>();
  18. }
  19. }
  20. public override void Initialize()
  21. {
  22. base.Initialize();
  23. InitializeOverlay();
  24. SubscribeNetworkEvent<FullPlayerListEvent>(OnPlayerListChanged);
  25. SubscribeNetworkEvent<PlayerInfoChangedEvent>(OnPlayerInfoChanged);
  26. }
  27. public override void Shutdown()
  28. {
  29. base.Shutdown();
  30. ShutdownOverlay();
  31. }
  32. private void OnPlayerInfoChanged(PlayerInfoChangedEvent ev)
  33. {
  34. if(ev.PlayerInfo == null) return;
  35. if (_playerList == null) _playerList = new();
  36. _playerList[ev.PlayerInfo.SessionId] = ev.PlayerInfo;
  37. PlayerListChanged?.Invoke(_playerList.Values.ToList());
  38. }
  39. private void OnPlayerListChanged(FullPlayerListEvent msg)
  40. {
  41. _playerList = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x);
  42. PlayerListChanged?.Invoke(msg.PlayersInfo);
  43. }
  44. }
  45. }