feat : 더미 플레이어 구현 / 더미클라 서비스 에코용, 더미 플레이어용 분기

This commit is contained in:
qornwh1
2026-03-04 08:55:27 +09:00
parent d2ba2ccb48
commit 9930348d5e
10 changed files with 678 additions and 287 deletions

View File

@@ -100,24 +100,6 @@ public class PlayerInfo
}
}
[ProtoContract]
public class ItemInfo
{
[ProtoMember(1)]
public int ItemId
{
get;
set;
}
[ProtoMember(2)]
public int Count
{
get;
set;
}
}
// ============================================================
// 인증
// ============================================================
@@ -134,7 +116,7 @@ public class RecvTokenPacket
}
}
// LOAD_GAME
// LOAD_GAME 내 정보
[ProtoContract]
public class LoadGamePacket
{
@@ -151,27 +133,96 @@ public class LoadGamePacket
get;
set;
}
[ProtoMember(3)]
public int MaplId
{
get;
set;
}
}
// ============================================================
// 로비
// ============================================================
// INTO_LOBBY
[ProtoContract]
public class IntoLobbyPacket
public class ChannelInfo
{
[ProtoMember(1)]
public int ChannelId
{
get;
set;
}
[ProtoMember(2)]
public int ChannelUserConut
{
get;
set;
}
[ProtoMember(3)]
public int ChannelUserMax
{
get;
set;
}
}
[ProtoContract]
public class LoadChannelPacket
{
[ProtoMember(1)]
public List<ChannelInfo> Channels
{
get;
set;
} = new List<ChannelInfo>();
}
// INTO_CHANNEL 클라->서버: 입장할 채널 ID / 서버->클라: 채널 내 나 이외 플레이어 목록
[ProtoContract]
public class IntoChannelPacket
{
[ProtoMember(1)]
public int ChannelId
{
get;
set;
} // 클라->서버: 입장할 채널 ID
[ProtoMember(2)]
public List<PlayerInfo> Players
{
get;
set;
} = null!;
} = new List<PlayerInfo>(); // 서버->클라: 채널 내 플레이어 목록
}
// EXIT_LOBBY
// UPDATE_CHANNEL_USER 유저 접속/나감
[ProtoContract]
public class ExitLobbyPacket
public class UpdateChannelUserPacket
{
[ProtoMember(1)]
public PlayerInfo Players
{
get;
set;
}
[ProtoMember(2)]
public bool IsAdd
{
get;
set;
}
}
// EXIT_CHANNEL 나가는 유저
[ProtoContract]
public class ExitChannelPacket
{
[ProtoMember(1)]
public int PlayerId
@@ -181,174 +232,6 @@ public class ExitLobbyPacket
}
}
// ============================================================
// 인스턴스 던전
// ============================================================
public enum BossState
{
START,
END,
PHASE_CHANGE
}
public enum BossResult
{
SUCCESS,
FAIL
}
// INTO_INSTANCE
[ProtoContract]
public class IntoInstancePacket
{
[ProtoMember(1)]
public int InstanceId
{
get;
set;
}
[ProtoMember(2)]
public int BossId
{
get;
set;
}
[ProtoMember(3)]
public List<int> PlayerIds
{
get;
set;
}
}
// UPDATE_BOSS
[ProtoContract]
public class UpdateBossPacket
{
[ProtoMember(1)]
public BossState State
{
get;
set;
}
[ProtoMember(2)]
public int Phase
{
get;
set;
}
[ProtoMember(3)]
public BossResult Result
{
get;
set;
} // END일 때만 유효
}
// REWARD_INSTANCE
[ProtoContract]
public class RewardInstancePacket
{
[ProtoMember(1)]
public int Exp
{
get;
set;
}
[ProtoMember(2)]
public List<ItemInfo> Items
{
get;
set;
}
}
// EXIT_INSTANCE
[ProtoContract]
public class ExitInstancePacket
{
[ProtoMember(1)]
public int PlayerId
{
get;
set;
}
}
// ============================================================
// 파티
// ============================================================
public enum PartyUpdateType
{
CREATE,
DELETE
}
public enum UserPartyUpdateType
{
JOIN,
LEAVE
}
// UPDATE_PARTY
[ProtoContract]
public class UpdatePartyPacket
{
[ProtoMember(1)]
public int PartyId
{
get;
set;
}
[ProtoMember(2)]
public PartyUpdateType Type
{
get;
set;
}
[ProtoMember(3)]
public int LeaderId
{
get;
set;
}
}
// UPDATE_USER_PARTY
[ProtoContract]
public class UpdateUserPartyPacket
{
[ProtoMember(1)]
public int PartyId
{
get;
set;
}
[ProtoMember(2)]
public int PlayerId
{
get;
set;
}
[ProtoMember(3)]
public UserPartyUpdateType Type
{
get;
set;
}
}
// ============================================================
// 플레이어
// ============================================================
@@ -604,3 +487,71 @@ public class DamagePacket
set;
}
}
// ============================================================
// 파티
// ============================================================
public enum PartyUpdateType
{
CREATE,
DELETE
}
public enum UserPartyUpdateType
{
JOIN,
LEAVE
}
// UPDATE_PARTY
[ProtoContract]
public class UpdatePartyPacket
{
[ProtoMember(1)]
public int PartyId
{
get;
set;
}
[ProtoMember(2)]
public PartyUpdateType Type
{
get;
set;
}
[ProtoMember(3)]
public int LeaderId
{
get;
set;
}
}
// UPDATE_USER_PARTY
[ProtoContract]
public class UpdateUserPartyPacket
{
[ProtoMember(1)]
public int PartyId
{
get;
set;
}
[ProtoMember(2)]
public int PlayerId
{
get;
set;
}
[ProtoMember(3)]
public UserPartyUpdateType Type
{
get;
set;
}
}

View File

@@ -1,61 +1,56 @@
namespace ClientTester.Packet;
public enum PacketCode : short
public enum PacketCode : ushort
{
NONE,
// 초기 클라이언트 시작시 jwt토큰 받아옴
RECV_TOKEN,
// jwt토큰 검증후 게임에 들어갈지 말지 (내 데이터도 전송)
// 내 정보 로드 (서버 -> 클라)
LOAD_GAME,
// 마을(로비)진입시 모든 데이터 로드
INTO_LOBBY,
// 모든 채널 로드 - jwt토큰 검증후 게임에 들어갈지 말지 (내 데이터도 전송)
// (서버 -> 클라)
LOAD_CHANNEL,
// 로비 나가기
EXIT_LOBBY,
// 나 채널 접속 (클라 -> 서버)
INTO_CHANNEL,
// 인스턴스 던전 입장
INTO_INSTANCE,
// 새로운 유저 채널 접속 (서버 -> 클라) / 유저 채널 나감 (서버 -> 클라)
UPDATE_CHANNEL_USER,
// 결과 보상
REWARD_INSTANCE,
// 채널 나가기 (클라 -> 서버)
EXIT_CHANNEL,
// 보스전 (시작, 종료)
UPDATE_BOSS,
// 플레이어 위치, 방향 (서버 -> 클라 \ 클라 -> 서버)
TRANSFORM_PLAYER,
// 인스턴스 던전 퇴장
EXIT_INSTANCE,
// 플레이어 행동 업데이트 (서버 -> 클라 \ 클라 -> 서버)
ACTION_PLAYER,
// 플레이어 스테이트 업데이트 (서버 -> 클라 \ 클라 -> 서버)
STATE_PLAYER,
// NPC 위치, 방향 (서버 -> 클라)
TRANSFORM_NPC,
// NPC 행동 업데이트 (서버 -> 클라)
ACTION_NPC,
// NPC 스테이트 업데이트 (서버 -> 클라)
STATE_NPC,
// 데미지 UI 전달 (서버 -> 클라)
DAMAGE,
// 파티 (생성, 삭제)
UPDATE_PARTY,
// 파티 유저 업데이트(추가 삭제)
UPDATE_USER_PARTY,
// 플레이어 위치, 방향
TRANSFORM_PLAYER,
// 플레이어 행동 업데이트
ACTION_PLAYER,
// 플레이어 스테이트 업데이트
STATE_PLAYER,
// NPC 위치, 방향
TRANSFORM_NPC,
// NPC 행동 업데이트
ACTION_NPC,
// NPC 스테이트 업데이트
STATE_NPC,
// 데미지 UI 전달
DAMAGE
UPDATE_USER_PARTY
}
public class PacketHeader
{
public PacketCode Code;
public int BodyLength;
public ushort BodyLength;
}

View File

@@ -16,10 +16,13 @@ namespace ClientTester.Packet
ushort size = (ushort)payload.Length;
byte[] result = new byte[4 + payload.Length];
// 2바이트 패킷 타입 헤더
result[0] = (byte)(type & 0xFF);
result[1] = (byte)(type >> 8);
// 2바이트 패킷 길이 헤더
result[2] = (byte)(size & 0xFF);
result[3] = (byte)(size >> 8);
// protobuf 페이로드
Buffer.BlockCopy(payload, 0, result, 4, payload.Length);
return result;
}
@@ -36,10 +39,12 @@ namespace ClientTester.Packet
ushort type = (ushort)(data[0] | (data[1] << 8));
ushort size = (ushort)(data[2] | (data[3] << 8));
// 헤더에 명시된 size와 실제 데이터 길이 검증
int actualPayloadLen = data.Length - 4;
if (size > actualPayloadLen)
{
Log.Warning("[PacketSerializer] 페이로드 크기 불일치 HeaderSize={Size} ActualSize={Actual}", size, actualPayloadLen);
Log.Warning("[PacketSerializer] 페이로드 크기 불일치 HeaderSize={Size} ActualSize={Actual}", size,
actualPayloadLen);
return (0, 0, null)!;
}