From 162d04d00562c5555ab5d3787d5d687285450b29 Mon Sep 17 00:00:00 2001 From: qornwh1 Date: Fri, 3 Apr 2026 08:43:54 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EC=B4=88=EA=B8=B0=20=EC=A1=B4=20?= =?UTF-8?q?=EC=A7=84=EC=9E=85=20/=20=EC=B1=84=EB=84=90=20=EB=82=98?= =?UTF-8?q?=EA=B0=88=EC=8B=9C=20=EC=A1=B4=EC=97=90=EC=84=9C=EB=8F=84=20?= =?UTF-8?q?=EB=82=98=EA=B0=80=EA=B2=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MMOserver/Game/Channel/Channel.cs | 16 ++++++++-------- .../MMOserver/Game/Channel/Maps/AMap.cs | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/MMOTestServer/MMOserver/Game/Channel/Channel.cs b/MMOTestServer/MMOserver/Game/Channel/Channel.cs index 4b1e9d4..6c42529 100644 --- a/MMOTestServer/MMOserver/Game/Channel/Channel.cs +++ b/MMOTestServer/MMOserver/Game/Channel/Channel.cs @@ -86,13 +86,16 @@ public class Channel : UserContainer public override void RemoveUser(int userId) { - base.RemoveUser(userId); - // 현재 맵에서도 제거 - if (maps.TryGetValue(userId, out AMap? currentMap)) + // 현재 맵에서 제거 (AMap.RemoveUser가 존까지 처리) + if (users.TryGetValue(userId, out Player? player)) { - currentMap.RemoveUser(userId); + if (maps.TryGetValue(player.CurrentMapId, out AMap? currentMap)) + { + currentMap.RemoveUser(userId); + } } + base.RemoveUser(userId); connectPeers.Remove(userId); } @@ -110,12 +113,9 @@ public class Channel : UserContainer oldMap.RemoveUser(userId); } + // AMap.AddUser가 존 0 배치 + CurrentZoneId = 0 처리 newMap.AddUser(userId, player); player.CurrentMapId = mapId; - player.CurrentZoneId = 0; - - // 현재 맵에 0번 존에 추가 - GetMap(mapId)?.GetZone(0)?.AddUser(player.PlayerId, player); return true; } diff --git a/MMOTestServer/MMOserver/Game/Channel/Maps/AMap.cs b/MMOTestServer/MMOserver/Game/Channel/Maps/AMap.cs index 3574bf8..8e73b37 100644 --- a/MMOTestServer/MMOserver/Game/Channel/Maps/AMap.cs +++ b/MMOTestServer/MMOserver/Game/Channel/Maps/AMap.cs @@ -63,6 +63,25 @@ public abstract class AMap : UserContainer return (row >= 0 && row < Rows && col >= 0 && col < Cols) ? row * Cols + col : -1; } + // 맵 입장 시 0번 존에 자동 배치 + public override void AddUser(int userId, Player player) + { + base.AddUser(userId, player); + player.CurrentZoneId = 0; + GetZone(0)?.AddUser(userId, player); + } + + // 맵 퇴장 시 현재 존에서 자동 제거 + public override void RemoveUser(int userId) + { + if (users.TryGetValue(userId, out Player? player)) + { + GetZone(player.CurrentZoneId)?.RemoveUser(userId); + } + + base.RemoveUser(userId); + } + // 이동시 zone업데이트 public bool UpdatePlayerZone(int userId, Player player) {