using System; using System.Collections.Generic; using System.Linq; using Content.Shared.Administration; using Content.Shared.Administration.Events; using Content.Shared.GameTicking; using Robust.Shared.GameObjects; using Robust.Shared.Network; namespace Content.Client.Administration { public sealed partial class AdminSystem : EntitySystem { public event Action>? PlayerListChanged; private Dictionary? _playerList; public IReadOnlyList PlayerList { get { if (_playerList != null) return _playerList.Values.ToList(); return new List(); } } public override void Initialize() { base.Initialize(); InitializeOverlay(); InitializeMenu(); SubscribeNetworkEvent(OnPlayerListChanged); SubscribeNetworkEvent(OnPlayerInfoChanged); SubscribeNetworkEvent(OnRoundRestartCleanup); } public override void Shutdown() { base.Shutdown(); ShutdownOverlay(); } private void OnRoundRestartCleanup(RoundRestartCleanupEvent msg, EntitySessionEventArgs args) { if (_playerList == null) return; foreach (var (id, playerInfo) in _playerList.ToArray()) { if (playerInfo.Connected) continue; _playerList.Remove(id); } PlayerListChanged?.Invoke(_playerList.Values.ToList()); } private void OnPlayerInfoChanged(PlayerInfoChangedEvent ev) { if(ev.PlayerInfo == null) return; if (_playerList == null) _playerList = new(); _playerList[ev.PlayerInfo.SessionId] = ev.PlayerInfo; PlayerListChanged?.Invoke(_playerList.Values.ToList()); } private void OnPlayerListChanged(FullPlayerListEvent msg) { _playerList = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x); PlayerListChanged?.Invoke(msg.PlayersInfo); } } }