클라이언트는 인프런 Rookiss 강의를 베이스로 제작되었습니다.

패킷 규칙 C_OOO : 클라이언트 → 서버 로 보내는 패킷 S_OOO : 서버 → 클라이언트 로 보내는 패킷

패킷은 Protobuf 로 제작되며 앞에 4바이트는 패킷의 사이즈, 그 다음 1바이트는 패킷의 아이디가 담기며, 이 후 패킷데이터가 포함됩니다. [ PacketSize ] [ PacketId ] [ PacketData ] 4 bytes 1 bytes

클라이언트에서 서버로 보내는 경우 사이즈 정보 4bytes 에서 데이터가 리틀 엔디안 으로 전송합니다. [ 7 ] [ 0 ] [ 0 ] [ 0 ] <- 사이즈가 7 인 경우 예시

서버에서 클라이언트로 보내는 경우 사이즈 정보 4bytes 에서 데이터를 빅 엔디안 으로 가정하고 파싱합니다. [ 0 ] [ 0 ] [ 0 ] [ 7 ] <- 사이즈가 7 인 경우 예시

Packet 상세 내용

Town Packet


<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 0 ]

message C_Enter{
  string nickname = 1;
  int32 class = 2;
}

응답 정보 나에게 : [ Id : 1 ] S_Enter

모두에게 : [ Id : 2 ] S_Spawn

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 1 ]

message S_Enter {
  PlayerInfo player = 1;
}

* PlayerInfo

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 2 ]

message S_Spawn {
  repeated PlayerInfo players = 1;
}

* PlayerInfo

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 5 ]

message S_Despawn {
  repeated int32 playerIds = 1;
}

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 6 ]

message C_Move {
  TransformInfo transform = 1;
}

* TransformInfo

응답 정보

모두에게 : [ Id : 7 ] S_Move

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 7 ]

message S_Move {
  int32 playerId = 1;
  TransformInfo transform = 2;
}

* TransformInfo

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 8 ]

message C_Animation {
  int32 animCode = 1;
}

응답 정보

모두에게 : [ Id : 9 ] S_Animation

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 9 ]

message S_Animation {
  int32 playerId = 1;
  int32 animCode = 2;
}

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 12 ]

message C_Chat{
  int32 playerId = 1;
  string senderName = 2;
  string chatMsg = 3;
}

응답 정보

모두에게 : [ Id : 13 ] S_Chat

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 13 ]

message S_Chat{
  int32 playerId = 1;
  string chatMsg = 2;

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 14 ]

message C_EnterDungeon{
  int32 dungeonCode = 1;
}

응답 정보

나에게 : [ Id : 16 ] S_EnterDungeon

모두에게 : [ Id : 5 ] S_Despawn

</aside>

<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 16 ]

message S_EnterDungeon{
  DungeonInfo dungeonInfo = 1;
  PlayerStatus player = 2;
  ScreenText screenText = 3; // Option
  BattleLog battleLog = 4;
}

* DungeonInfo

* PlayerStatus

* BattleLog

* ScreenText

C_EnterDungeon 을 통해 입장할때도 활용가능하지만 던전 로직중 몬스터를 다 처리하고 다음 던전으로 넘어가는 등 새로운 던전의 세팅이 필요할때도 해당 패킷을 사용합니다.

</aside>

Battle Packet


<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 15 ]

message C_PlayerResponse{
  int32 responseCode = 1;
}

responseCode 의 가용 범위는 0 ~ 6입니다.

</aside>