클라이언트는 인프런 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 인 경우 예시
<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;
}
</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;
}
</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;
}
응답 정보
모두에게 : [ 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;
}
</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;
}
C_EnterDungeon 을 통해 입장할때도 활용가능하지만 던전 로직중 몬스터를 다 처리하고 다음 던전으로 넘어가는 등 새로운 던전의 세팅이 필요할때도 해당 패킷을 사용합니다.
</aside>
<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>
<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 17 ]
message S_LeaveDungeon { }
해당 패킷을 전달받으면 클라이언트는 마을 화면으로 이동합니다.
마을에 입장하면 유저는 다시 C_Enter 패킷을 전송합니다.
입장 전달받으면 다시 3. 플레이어 생성 부분 부터 진행합니다.
</aside>
<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" /> Packet [ Id : 18 ]
message S_ScreenText{
ScreenText screenText = 1;
}
</aside>
<aside> <img src="/icons/document_brown.svg" alt="/icons/document_brown.svg" width="40px" />
Packet [ Id : 19 ]
message S_ScreenDone { }
</aside>