feat(packet): implement zstd compression and refactor packet decoding

This commit is contained in:
2026-06-26 20:20:34 +08:00
parent c7c6ee9a61
commit d31ec68f3c
4 changed files with 125 additions and 38 deletions

View File

@@ -45,7 +45,7 @@ asio::awaitable<void> NetworkClient::connect(std::string ip, int port) {
asio::awaitable<void> NetworkClient::read_loop() {
try {
while (true) {
std::array<char, HEADER_LEN> header_buffer;
std::array<uint8_t, HEADER_LEN> header_buffer;
co_await asio::async_read(m_socket, asio::buffer(header_buffer),
asio::use_awaitable);
auto header = decode_packet_header(header_buffer);
@@ -66,7 +66,7 @@ asio::awaitable<void> NetworkClient::read_loop() {
case to_num(PacketEnum::LOGIN_RSP): {
LoginRsp rsp;
Logger::info("Client: Receive Login rsp");
if (rsp.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(rsp, body_data, header)) {
if (rsp.success()) {
m_world.start_client_thread(rsp.uuid());
} else {
@@ -76,34 +76,34 @@ asio::awaitable<void> NetworkClient::read_loop() {
} break;
case to_num(PacketEnum::CHUNK_DATA_RSP): {
ChunkDataRsp rsp;
// Logger::info("Client: Receive Chunk Data rsp, size {}mb",
// body_data.size() / 1024.0f / 1024);
if (rsp.ParseFromArray(body_data.data(), body_data.size())) {
Logger::info("Client: Receive Chunk Data rsp, size {}mb",
body_data.size() / 1024.0f / 1024);
if (decode_packet(rsp, body_data, header)) {
m_world.receive_chunk(rsp);
}
} break;
case to_num(PacketEnum::BLOCK_CHANGE_RSP): {
BlockChangeRsp rsp;
Logger::info("Client: Receive Block Change rsp");
if (rsp.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(rsp, body_data, header)) {
m_world.receive_block_change(rsp);
}
} break;
case to_num(PacketEnum::UPDATE_TIME): {
UpdateTime rsp;
if (rsp.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(rsp, body_data, header)) {
m_world.receive_time(rsp);
}
} break;
case to_num(PacketEnum::PLAYER_INFO_RSP): {
PlayerInfoRsp rsp;
if (rsp.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(rsp, body_data, header)) {
m_world.receive_other_player(rsp);
}
} break;
case to_num(PacketEnum::LOGOUT_RSP): {
LogoutRsp rsp;
if (rsp.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(rsp, body_data, header)) {
m_world.receive_player_logout(rsp);
}
} break;

View File

@@ -37,7 +37,7 @@ const std::string& Session::uuid() const { return m_uuid; }
asio::awaitable<void> Session::read_loop() {
try {
while (true) {
std::array<char, HEADER_LEN> header_buffer;
std::array<uint8_t, HEADER_LEN> header_buffer;
co_await asio::async_read(m_socket, asio::buffer(header_buffer),
asio::use_awaitable);
@@ -58,14 +58,14 @@ asio::awaitable<void> Session::read_loop() {
if (cmd_id == to_num(PacketEnum::LOGIN_REQ)) {
LoginReq req;
Logger::info("Session: Receive Login req");
if (req.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(req, body_data, header)) {
m_server_world.handle_player_login(req.name(),
shared_from_this());
}
}
if (cmd_id == to_num(PacketEnum::PLAYER_POS)) {
PlayerPos pos;
if (pos.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(pos, body_data, header)) {
m_server_world.sync_player_pos(pos.uuid(), pos.pos().x(),
pos.pos().y(),
pos.pos().z());
@@ -74,7 +74,7 @@ asio::awaitable<void> Session::read_loop() {
if (cmd_id == to_num(PacketEnum::CHUNK_DATA_REQ)) {
ChunkDataReq req;
// Logger::info("Session: Receive Chunk Data req");
if (req.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(req, body_data, header)) {
m_server_world.handle_chunk_req(
req.uuid(), ChunkPos(req.pos().x(), req.pos().z()));
}
@@ -82,13 +82,13 @@ asio::awaitable<void> Session::read_loop() {
if (cmd_id == to_num(PacketEnum::BLOCK_CHANGE_REQ)) {
BlockChangeReq req;
Logger::info("Session: Receive Block Change req");
if (req.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(req, body_data, header)) {
m_server_world.handle_block_change(req);
}
}
if (cmd_id == to_num(PacketEnum::LOGOUT_REQ)) {
LogoutReq req;
if (req.ParseFromArray(body_data.data(), body_data.size())) {
if (decode_packet(req, body_data, header)) {
m_server_world.handle_player_exit(req.uuid());
}
}