From dd8dcc58d265a45938a2d2cf62e4fe2fb3baf8a0 Mon Sep 17 00:00:00 2001 From: qornwh1 Date: Mon, 16 Mar 2026 19:19:59 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EB=B3=B4=EC=8A=A4=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EB=93=9C=20=EC=8B=A0=EC=B2=AD=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=ED=8C=A8=ED=82=B7=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MMOTestServer/MMOserver/Api/BossRaidResult.cs | 13 +++++++++ MMOTestServer/MMOserver/Api/RestApi.cs | 29 +++++++++++++------ MMOTestServer/MMOserver/Game/GameServer.cs | 8 +++-- MMOTestServer/MMOserver/Packet/PacketBody.cs | 14 +++++++++ 4 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 MMOTestServer/MMOserver/Api/BossRaidResult.cs diff --git a/MMOTestServer/MMOserver/Api/BossRaidResult.cs b/MMOTestServer/MMOserver/Api/BossRaidResult.cs new file mode 100644 index 0000000..4a9c629 --- /dev/null +++ b/MMOTestServer/MMOserver/Api/BossRaidResult.cs @@ -0,0 +1,13 @@ +namespace MMOserver.Api; + +// RestApi.BossRaidAccesssAsync 반환용 도메인 모델 +// API 응답(BossRaidAccessResponse)을 직접 노출하지 않고 이걸로 매핑해서 반환 +public sealed class BossRaidResult +{ + public int RoomId { get; init; } + public string SessionName { get; init; } = string.Empty; + public int BossId { get; init; } + public List Players { get; init; } = new(); + public string Status { get; init; } = string.Empty; + public string? Tokens { get; init; } +} diff --git a/MMOTestServer/MMOserver/Api/RestApi.cs b/MMOTestServer/MMOserver/Api/RestApi.cs index 254f464..4de9bfa 100644 --- a/MMOTestServer/MMOserver/Api/RestApi.cs +++ b/MMOTestServer/MMOserver/Api/RestApi.cs @@ -70,8 +70,8 @@ public class RestApi : Singleton } // 레이드 채널 접속 여부 체크 - // 성공 시 sessionName 반환, 실패/거절 시 null 반환 - public async Task BossRaidAccesssAsync(List userNames, int bossId) + // 성공 시 BossRaidResult 반환, 실패/거절 시 null 반환 + public async Task BossRaidAccesssAsync(List userNames, int bossId) { string url = AppConfig.RestApi.BaseUrl + "/api/internal/bossraid/entry"; @@ -85,20 +85,31 @@ public class RestApi : Singleton if (response.StatusCode == HttpStatusCode.Unauthorized) { Log.Warning("[RestApi] 보스 레이드 접속 인증 실패 (401)"); - return false; + return null; } // 400: 입장 조건 미충족 (레벨 부족, 이미 진행중 등) if (response.StatusCode == HttpStatusCode.BadRequest) { Log.Warning("[RestApi] 보스 레이드 입장 거절 (400) BossId={BossId}", bossId); - return false; + return null; } response.EnsureSuccessStatusCode(); - BossRaidAccessResponse? result = await response.Content.ReadFromJsonAsync(); - return result?.BossId > 0 ? true : false; + BossRaidAccessResponse? raw = await response.Content.ReadFromJsonAsync(); + if (raw == null) return null; + + // API 응답 → 도메인 모델 매핑 + return new BossRaidResult + { + RoomId = raw.RoomId, + SessionName = raw.SessionName ?? string.Empty, + BossId = raw.BossId, + Players = raw.Players, + Status = raw.Status ?? string.Empty, + Tokens = raw.Tokens + }; } catch (Exception ex) when (attempt < MAX_RETRY) { @@ -111,7 +122,7 @@ public class RestApi : Singleton } } - return false; + return null; } private sealed class BossRaidAccessResponse @@ -152,10 +163,10 @@ public class RestApi : Singleton } [JsonPropertyName("tokens")] - public Dictionary Tokens + public string? Tokens { get; set; - } = new(); + } } } diff --git a/MMOTestServer/MMOserver/Game/GameServer.cs b/MMOTestServer/MMOserver/Game/GameServer.cs index e02fd0f..d920875 100644 --- a/MMOTestServer/MMOserver/Game/GameServer.cs +++ b/MMOTestServer/MMOserver/Game/GameServer.cs @@ -1076,10 +1076,10 @@ public class GameServer : ServerBase userNames.Add(channel.GetPlayer(memberId).Nickname); } - bool? result = await RestApi.Instance.BossRaidAccesssAsync(userNames, 1); + BossRaidResult? result = await RestApi.Instance.BossRaidAccesssAsync(userNames, 1); // 입장 실패 - if (result.Value == false) + if (result != null) { SendTo(peer, PacketSerializer.Serialize((ushort)PacketCode.INTO_BOSS_RAID, @@ -1087,6 +1087,7 @@ public class GameServer : ServerBase Log.Debug("[GameServer] INTO_BOSS_RAID HashKey={Key} PartyId={PartyId} AssignedRaidMapId={RaidId} Failed", hashKey, party.PartyId, -1); + return; } // 레이드 맵 할당 (미사용 맵 탐색 → 없으면 동적 생성) @@ -1146,7 +1147,8 @@ public class GameServer : ServerBase // 파티장에게 입장 성공 응답 (할당된 실제 레이드 맵 ID 전달) SendTo(peer, PacketSerializer.Serialize((ushort)PacketCode.INTO_BOSS_RAID, - new IntoBossRaidPacket { RaidId = assignedRaidMapId, IsSuccess = true })); + new IntoBossRaidPacket + { RaidId = assignedRaidMapId, IsSuccess = true, Session = result.SessionName, Token = result.Tokens })); Log.Debug("[GameServer] INTO_BOSS_RAID HashKey={Key} PartyId={PartyId} AssignedRaidMapId={RaidId}", hashKey, party.PartyId, assignedRaidMapId); diff --git a/MMOTestServer/MMOserver/Packet/PacketBody.cs b/MMOTestServer/MMOserver/Packet/PacketBody.cs index bfc45c4..f440eaa 100644 --- a/MMOTestServer/MMOserver/Packet/PacketBody.cs +++ b/MMOTestServer/MMOserver/Packet/PacketBody.cs @@ -769,6 +769,20 @@ public class IntoBossRaidPacket get; set; } + + [ProtoMember(3)] + public string Token + { + get; + set; + } + + [ProtoMember(4)] + public string Session + { + get; + set; + } } // PARTY_CHANGE_MAP (클라 -> 서버 전용)