using System; using System.Collections.Generic; namespace XWorld.Framework { public interface IRoomPlayerService { IReadOnlyList GetRoomPlayers(); bool TryGetRoomPlayer(int playerId, out PlayerInfo player); void RequestPlayerInfo(int playerId, Action onLoaded); } public sealed class RoomPlayerService : IRoomPlayerService { private readonly List _players = new List(); private readonly Dictionary _byId = new Dictionary(); public void SetRoomPlayers(IEnumerable players) { _players.Clear(); _byId.Clear(); if (players == null) { return; } foreach (PlayerInfo player in players) { if (player == null) { continue; } PlayerInfo copy = Clone(player); _players.Add(copy); _byId[copy.PlayerId] = copy; } } public IReadOnlyList GetRoomPlayers() { var copy = new List(_players.Count); for (int i = 0; i < _players.Count; i++) { copy.Add(Clone(_players[i])); } return copy; } public bool TryGetRoomPlayer(int playerId, out PlayerInfo player) { if (_byId.TryGetValue(playerId, out PlayerInfo cached)) { player = Clone(cached); return true; } player = null; return false; } public void RequestPlayerInfo(int playerId, Action onLoaded) { TryGetRoomPlayer(playerId, out PlayerInfo player); onLoaded?.Invoke(player); } private static PlayerInfo Clone(PlayerInfo source) { return new PlayerInfo { PlayerId = source.PlayerId, Name = source.Name, IsAI = source.IsAI, Level = source.Level, AppearanceType = source.AppearanceType, AvatarId = source.AvatarId, }; } } }