using LiteNetLib; using MMOserver.Game.Channel; using MMOserver.Packet; using ProtoBuf; using Serilog; using ServerLib.Service; namespace MMOserver.Game.Service; /* * 채널 나가는 메시지 핸들러 */ public partial class GameServer : ServerBase { private void OnExitChannel(NetPeer peer, int hashKey, byte[] payload) { ExitChannelPacket packet = Serializer.Deserialize(new ReadOnlyMemory(payload)); ChannelManager cm = ChannelManager.Instance; // 제거 전에 채널/플레이어 정보 저장 (브로드캐스트에 필요) int channelId = cm.HasUser(hashKey); Player? player = channelId >= 0 ? cm.GetChannel(channelId).GetPlayer(hashKey) : null; // 파티 자동 탈퇴 if (channelId >= 0) { HandlePartyLeaveOnExit(channelId, hashKey); } cm.RemoveUser(hashKey); Log.Debug("[GameServer] EXIT_CHANNEL HashKey={Key} PlayerId={PlayerId}", hashKey, packet.PlayerId); // 같은 채널 유저들에게 나갔다고 알림 if (channelId >= 0 && player != null) { SendExitChannelPacket(peer, hashKey, channelId, player); } } }