using LiteNetLib; using MMOserver.Game.Channel.Maps; namespace MMOserver.Game.Channel; public class Channel { // 로비 private Robby robby = new Robby(); // 채널 내 유저 상태 (hashKey → Player) private Dictionary connectUsers = new Dictionary(); // 채널 내 유저 NetPeer (hashKey → NetPeer) — BroadcastToChannel 교차 조회 제거용 private Dictionary connectPeers = new Dictionary(); public int ChannelId { get; private set; } public int UserCount { get; private set; } public int UserCountMax { get; private set; } = 100; public Channel(int channelId) { ChannelId = channelId; } public void AddUser(long userId, Player player, NetPeer peer) { connectUsers[userId] = player; connectPeers[userId] = peer; UserCount++; } public void RemoveUser(long userId) { connectUsers.Remove(userId); connectPeers.Remove(userId); UserCount--; } // 재연결(WiFi→LTE 등) 시 동일 유저의 peer 교체 public void UpdatePeer(long userId, NetPeer peer) { connectPeers[userId] = peer; } // 채널 내 모든 유저의 hashKey 반환 (채널 입장 시 기존 플레이어 목록 조회용) public IEnumerable GetConnectUsers() { return connectUsers.Keys; } // 채널 내 모든 Player 반환 public IEnumerable GetPlayers() { return connectUsers.Values; } // 채널 내 모든 NetPeer 반환 — BroadcastToChannel 전용 (sessions 교차 조회 불필요) public IEnumerable GetConnectPeers() { return connectPeers.Values; } // 특정 유저의 Player 반환 public Player? GetPlayer(long userId) { connectUsers.TryGetValue(userId, out Player? player); return player; } public int HasUser(long userId) { if (connectUsers.ContainsKey(userId)) { return ChannelId; } return -1; } // 로비 가져옴 public Robby GetRobby() { return robby; } }