From 056ec8d0c38df70faf4775b51de249cc890020b0 Mon Sep 17 00:00:00 2001 From: qornwh1 Date: Wed, 11 Mar 2026 15:09:06 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=ED=8C=8C=ED=8B=B0=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EchoClientTester/Packet/PacketBody.cs | 33 +++++++++++++++++++ MMOTestServer/MMOserver/Game/GameServer.cs | 22 +++++++++++++ .../MMOserver/Game/Party/PartyManager.cs | 21 ++++++++++++ MMOTestServer/MMOserver/Packet/PacketBody.cs | 4 ++- 4 files changed, 79 insertions(+), 1 deletion(-) diff --git a/ClientTester/EchoClientTester/Packet/PacketBody.cs b/ClientTester/EchoClientTester/Packet/PacketBody.cs index 1ed7191..65b5bd6 100644 --- a/ClientTester/EchoClientTester/Packet/PacketBody.cs +++ b/ClientTester/EchoClientTester/Packet/PacketBody.cs @@ -210,6 +210,32 @@ public class LoadChannelPacket } = new List(); } +// 채널 내 파티 정보 (INTO_CHANNEL 응답에 포함) +[ProtoContract] +public class PartyInfoData +{ + [ProtoMember(1)] + public int PartyId + { + get; + set; + } + + [ProtoMember(2)] + public int LeaderId + { + get; + set; + } + + [ProtoMember(3)] + public List MemberPlayerIds + { + get; + set; + } = new List(); +} + // INTO_CHANNEL 클라->서버: 입장할 채널 ID / 서버->클라: 채널 내 나 이외 플레이어 목록 [ProtoContract] public class IntoChannelPacket @@ -227,6 +253,13 @@ public class IntoChannelPacket get; set; } = new List(); // 서버->클라: 채널 내 플레이어 목록 + + [ProtoMember(3)] + public List Parties + { + get; + set; + } = new List(); // 서버->클라: 채널 내 파티 목록 } // UPDATE_CHANNEL_USER 유저 접속/나감 diff --git a/MMOTestServer/MMOserver/Game/GameServer.cs b/MMOTestServer/MMOserver/Game/GameServer.cs index c05c3e6..902a546 100644 --- a/MMOTestServer/MMOserver/Game/GameServer.cs +++ b/MMOTestServer/MMOserver/Game/GameServer.cs @@ -584,6 +584,28 @@ public class GameServer : ServerBase BroadcastToUsers(party.PartyMemberIds, data); // 전원 (리더 포함) break; } + case PartyUpdateType.UPDATE: + { + if (!pm.UpdateParty(hashKey, req.PartyId, out PartyInfo? party)) + { + SendError(peer, ErrorCode.PARTY_UPDATE_FAILED); + return; + } + + UpdatePartyPacket notify = new UpdatePartyPacket + { + PartyId = req.PartyId, + Type = PartyUpdateType.LEAVE, + LeaderId = party?.LeaderId ?? 0, + PlayerId = hashKey, + }; + byte[] data = PacketSerializer.Serialize((ushort)PacketCode.UPDATE_PARTY, notify); + if (party != null) + { + BroadcastToUsers(party.PartyMemberIds, data); // 남은 멤버들에게 + } + break; + } } } diff --git a/MMOTestServer/MMOserver/Game/Party/PartyManager.cs b/MMOTestServer/MMOserver/Game/Party/PartyManager.cs index 39b97cd..430a59b 100644 --- a/MMOTestServer/MMOserver/Game/Party/PartyManager.cs +++ b/MMOTestServer/MMOserver/Game/Party/PartyManager.cs @@ -119,6 +119,27 @@ public class PartyManager return true; } + // 파티 업데이트 + public bool UpdateParty(int leaderId, int partyId, out PartyInfo? party) + { + party = null; + + if (!parties.TryGetValue(partyId, out party)) + { + return false; + } + + if (party.LeaderId != leaderId) + { + party = null; + return false; // 리더만 업데이트 가능 + } + + // 파티 이름 변경 + party.PartyName = party.PartyName; + return true; + } + // 전체 파티 목록 조회 public IEnumerable GetAllParties() { diff --git a/MMOTestServer/MMOserver/Packet/PacketBody.cs b/MMOTestServer/MMOserver/Packet/PacketBody.cs index db2dc23..76f28a2 100644 --- a/MMOTestServer/MMOserver/Packet/PacketBody.cs +++ b/MMOTestServer/MMOserver/Packet/PacketBody.cs @@ -560,6 +560,7 @@ public enum ErrorCode : int PARTY_JOIN_FAILED = 10022, PARTY_NOT_IN_PARTY = 10023, PARTY_DELETE_FAILED = 10024, + PARTY_UPDATE_FAILED = 10025, } // ERROR (서버 -> 클라) @@ -583,7 +584,8 @@ public enum PartyUpdateType CREATE, DELETE, JOIN, - LEAVE + LEAVE, + UPDATE } // REQUEST_PARTY (클라 -> 서버) - CREATE: PartyName 사용 / JOIN·LEAVE·DELETE: PartyId 사용