From 943302c2f1dc4e4b8dfbb3287b21131f60b1204f Mon Sep 17 00:00:00 2001 From: qornwh1 Date: Mon, 16 Mar 2026 16:07:49 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20=EB=A7=B5=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=EC=8B=9C=20=EC=9C=A0=EC=A0=80=20=EC=A7=84=EC=9E=85=20=EB=8F=99?= =?UTF-8?q?=EA=B8=B0=ED=99=94=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MMOserver/Game/Channel/Channel.cs | 5 ++-- MMOTestServer/MMOserver/Game/GameServer.cs | 27 +++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/MMOTestServer/MMOserver/Game/Channel/Channel.cs b/MMOTestServer/MMOserver/Game/Channel/Channel.cs index 48b2799..b4a867a 100644 --- a/MMOTestServer/MMOserver/Game/Channel/Channel.cs +++ b/MMOTestServer/MMOserver/Game/Channel/Channel.cs @@ -67,9 +67,10 @@ public class Channel public void RemoveUser(int userId) { // 현재 맵에서도 제거 - if (connectUsers.TryGetValue(userId, out Player? player)) + if (connectUsers.TryGetValue(userId, out Player? player) && + maps.TryGetValue(player.CurrentMapId, out AMap? currentMap)) { - maps[player.CurrentMapId].RemoveUser(userId); + currentMap.RemoveUser(userId); } connectUsers.Remove(userId); diff --git a/MMOTestServer/MMOserver/Game/GameServer.cs b/MMOTestServer/MMOserver/Game/GameServer.cs index 346592f..6acf37d 100644 --- a/MMOTestServer/MMOserver/Game/GameServer.cs +++ b/MMOTestServer/MMOserver/Game/GameServer.cs @@ -451,8 +451,7 @@ public class GameServer : ServerBase { HashKey = hashKey, PlayerId = hashKey, - Nickname = hashKey.ToString(), - CurrentMapId = 1 + Nickname = hashKey.ToString() }; // 채널에 추가 @@ -464,6 +463,30 @@ public class GameServer : ServerBase // 내 정보 전달 SendLoadGame(peer, hashKey); + + // 초기 맵(로비 1번) 진입 알림 + // Channel.AddUser → ChangeMap(1) 에서 이미 맵에 추가됨 + PlayerInfo playerInfo = ToPlayerInfo(newPlayer); + int initMapId = newPlayer.CurrentMapId; + + // 기존 맵 유저들에게 입장 알림 (본인 제외) + ChangeMapPacket enterNotify = new() { MapId = initMapId, IsAdd = true, Player = playerInfo }; + BroadcastToMap(packet.ChannelId, initMapId, + PacketSerializer.Serialize((ushort)PacketCode.CHANGE_MAP, enterNotify), peer); + + // 본인에게 현재 맵의 플레이어 목록 전달 + ChangeMapPacket response = new() { MapId = initMapId }; + AMap? initMap = newChannel.GetMap(initMapId); + if (initMap != null) + { + foreach (var (userId, p) in initMap.GetUsers()) + { + if (userId == hashKey) continue; + response.Players.Add(ToPlayerInfo(p)); + } + } + SendTo(peer, PacketSerializer.Serialize((ushort)PacketCode.CHANGE_MAP, response)); + } private void OnIntoChannelParty(NetPeer peer, int hashKey, byte[] payload)