2 Commits

Author SHA1 Message Date
qornwh1
3188dbeb3d feat : 서버 실패 코드 메시지 기능 추가 2026-03-08 22:03:06 +09:00
qornwh1
06741f2a55 feat : 파티매니저 채널에 종속되도록 변경 2026-03-08 22:01:55 +09:00
7 changed files with 92 additions and 4 deletions

View File

@@ -516,6 +516,31 @@ public class DamagePacket
} }
} }
// ============================================================
// 에러
// ============================================================
public enum ErrorCode : int
{
// 파티 (10021~)
PARTY_ALREADY_IN_PARTY = 10021,
PARTY_JOIN_FAILED = 10022,
PARTY_NOT_IN_PARTY = 10023,
PARTY_DELETE_FAILED = 10024,
}
// ERROR (서버 -> 클라)
[ProtoContract]
public class ErrorPacket
{
[ProtoMember(1)]
public ErrorCode Code
{
get;
set;
}
}
// ============================================================ // ============================================================
// 파티 // 파티
// ============================================================ // ============================================================

View File

@@ -52,7 +52,10 @@ public enum PacketCode : ushort
UPDATE_PARTY, UPDATE_PARTY,
// 파티 참가/탈퇴/생성/해산 요청 (클라 -> 서버) // 파티 참가/탈퇴/생성/해산 요청 (클라 -> 서버)
REQUEST_PARTY REQUEST_PARTY,
// 요청 실패 응답 (서버 -> 클라)
ERROR = 9999
} }
public class PacketHeader public class PacketHeader

View File

@@ -1,5 +1,6 @@
using LiteNetLib; using LiteNetLib;
using MMOserver.Game.Channel.Maps; using MMOserver.Game.Channel.Maps;
using MMOserver.Game.Party;
namespace MMOserver.Game.Channel; namespace MMOserver.Game.Channel;
@@ -8,6 +9,9 @@ public class Channel
// 로비 // 로비
private Robby robby = new Robby(); private Robby robby = new Robby();
// 파티
private PartyManager partyManager = new PartyManager();
// 채널 내 유저 상태 (hashKey → Player) // 채널 내 유저 상태 (hashKey → Player)
private Dictionary<int, Player> connectUsers = new Dictionary<int, Player>(); private Dictionary<int, Player> connectUsers = new Dictionary<int, Player>();
@@ -97,4 +101,10 @@ public class Channel
{ {
return robby; return robby;
} }
// 파티매니저 가져옴
public PartyManager GetPartyManager()
{
return partyManager;
}
} }

View File

@@ -468,7 +468,15 @@ public class GameServer : ServerBase
private void OnRequestParty(NetPeer peer, int hashKey, byte[] payload) private void OnRequestParty(NetPeer peer, int hashKey, byte[] payload)
{ {
RequestPartyPacket req = Serializer.Deserialize<RequestPartyPacket>(new ReadOnlyMemory<byte>(payload)); RequestPartyPacket req = Serializer.Deserialize<RequestPartyPacket>(new ReadOnlyMemory<byte>(payload));
PartyManager pm = PartyManager.Instance;
ChannelManager cm = ChannelManager.Instance;
int channelId = cm.HasUser(hashKey);
if (channelId < 0)
{
return;
}
PartyManager pm = cm.GetChannel(channelId).GetPartyManager();
switch (req.Type) switch (req.Type)
{ {
@@ -476,6 +484,7 @@ public class GameServer : ServerBase
{ {
if (!pm.CreateParty(hashKey, req.PartyName, out PartyInfo? party)) if (!pm.CreateParty(hashKey, req.PartyName, out PartyInfo? party))
{ {
SendError(peer, ErrorCode.PARTY_ALREADY_IN_PARTY);
return; return;
} }
@@ -495,6 +504,7 @@ public class GameServer : ServerBase
{ {
if (!pm.JoinParty(hashKey, req.PartyId, out PartyInfo? party)) if (!pm.JoinParty(hashKey, req.PartyId, out PartyInfo? party))
{ {
SendError(peer, ErrorCode.PARTY_JOIN_FAILED);
return; return;
} }
@@ -513,6 +523,7 @@ public class GameServer : ServerBase
{ {
if (!pm.LeaveParty(hashKey, out PartyInfo? party)) if (!pm.LeaveParty(hashKey, out PartyInfo? party))
{ {
SendError(peer, ErrorCode.PARTY_NOT_IN_PARTY);
return; return;
} }
@@ -525,7 +536,10 @@ public class GameServer : ServerBase
}; };
byte[] data = PacketSerializer.Serialize<UpdatePartyPacket>((ushort)PacketCode.UPDATE_PARTY, notify); byte[] data = PacketSerializer.Serialize<UpdatePartyPacket>((ushort)PacketCode.UPDATE_PARTY, notify);
if (party != null) if (party != null)
{
BroadcastToUsers(party.PartyMemberIds, data); // 남은 멤버들에게 BroadcastToUsers(party.PartyMemberIds, data); // 남은 멤버들에게
}
SendTo(peer, data); // 탈퇴자 본인에게 SendTo(peer, data); // 탈퇴자 본인에게
break; break;
} }
@@ -533,6 +547,7 @@ public class GameServer : ServerBase
{ {
if (!pm.DeleteParty(hashKey, req.PartyId, out PartyInfo? party)) if (!pm.DeleteParty(hashKey, req.PartyId, out PartyInfo? party))
{ {
SendError(peer, ErrorCode.PARTY_DELETE_FAILED);
return; return;
} }
@@ -549,6 +564,13 @@ public class GameServer : ServerBase
} }
} }
private void SendError(NetPeer peer, ErrorCode code)
{
ErrorPacket err = new ErrorPacket { Code = code };
byte[] data = PacketSerializer.Serialize<ErrorPacket>((ushort)PacketCode.ERROR, err);
SendTo(peer, data);
}
private void BroadcastToUsers(IEnumerable<int> userIds, byte[] data, DeliveryMethod method = DeliveryMethod.ReliableOrdered) private void BroadcastToUsers(IEnumerable<int> userIds, byte[] data, DeliveryMethod method = DeliveryMethod.ReliableOrdered)
{ {
foreach (int userId in userIds) foreach (int userId in userIds)

View File

@@ -2,7 +2,7 @@ using MMOserver.Utils;
namespace MMOserver.Game.Party; namespace MMOserver.Game.Party;
public class PartyManager : Singleton<PartyManager> public class PartyManager
{ {
private readonly UuidGenerator partyUuidGenerator = new UuidGenerator(); private readonly UuidGenerator partyUuidGenerator = new UuidGenerator();

View File

@@ -516,6 +516,31 @@ public class DamagePacket
} }
} }
// ============================================================
// 에러
// ============================================================
public enum ErrorCode : int
{
// 파티 (10021~)
PARTY_ALREADY_IN_PARTY = 10021,
PARTY_JOIN_FAILED = 10022,
PARTY_NOT_IN_PARTY = 10023,
PARTY_DELETE_FAILED = 10024,
}
// ERROR (서버 -> 클라)
[ProtoContract]
public class ErrorPacket
{
[ProtoMember(1)]
public ErrorCode Code
{
get;
set;
}
}
// ============================================================ // ============================================================
// 파티 // 파티
// ============================================================ // ============================================================

View File

@@ -52,7 +52,10 @@ public enum PacketCode : ushort
UPDATE_PARTY, UPDATE_PARTY,
// 파티 참가/탈퇴/생성/해산 요청 (클라 -> 서버) // 파티 참가/탈퇴/생성/해산 요청 (클라 -> 서버)
REQUEST_PARTY REQUEST_PARTY,
// 요청 실패 응답 (서버 -> 클라)
ERROR = 9999
} }
public class PacketHeader public class PacketHeader