From 3788bc36dd23a290628d14c999270e3fed99a0b7 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Tue, 6 May 2025 03:22:15 +0300 Subject: [PATCH] infinity world --- src/server/mod.rs | 1 + src/server/protocol/play.rs | 41 +++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 6166e8d..19988a5 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -18,6 +18,7 @@ pub mod protocol; #[derive(Debug)] pub enum ServerError { UnexpectedPacket(u8), // Неожиданный пакет + WrongPacket, // Пакет поломан, неверные данные Protocol(ProtocolError), // Ошибка в протоколе при работе с rust_mc_proto ConnectionClosed, // Соединение закрыто, единственная ошибка которая не логируется у handle_connection SerTextComponent, // Ошибка при сериализации текст-компонента diff --git a/src/server/protocol/play.rs b/src/server/protocol/play.rs index f3d6217..8e4cc33 100644 --- a/src/server/protocol/play.rs +++ b/src/server/protocol/play.rs @@ -231,7 +231,7 @@ pub fn send_keep_alive(client: Arc) -> Result<(), ServerError> { let timestamp2 = packet.read_long()?; if timestamp2 != timestamp { // Послать клиента нахуй - Err(ServerError::UnexpectedPacket(serverbound::play::KEEP_ALIVE)) + Err(ServerError::WrongPacket) } else { Ok(()) } @@ -248,6 +248,24 @@ pub fn send_system_message( client.write_packet(&packet) } +pub fn send_example_chunks_in_distance( + client: Arc, + chunks: &mut Vec<(i32, i32)>, + distance: i32, + center: (i32, i32), +) -> Result<(), ServerError> { + for x in -distance + center.0..=distance + center.0 { + for z in -distance + center.1..=distance + center.1 { + if !chunks.contains(&(x, z)) { + send_example_chunk(client.clone(), x as i32, z as i32)?; + chunks.push((x, z)); + } + } + } + + Ok(()) +} + // Отдельная функция для работы с самой игрой pub fn handle_play_state( client: Arc, // Контекст клиента @@ -266,11 +284,11 @@ pub fn handle_play_state( send_game_event(client.clone(), 13, 0.0)?; // 13 - Start waiting for level chunks set_center_chunk(client.clone(), 0, 0)?; - for x in -1..=1 { - for z in -1..=1 { - send_example_chunk(client.clone(), x, z)?; - } - } + let mut chunks = Vec::new(); + + let view_distance = client.client_info().unwrap().view_distance as i32; + + send_example_chunks_in_distance(client.clone(), &mut chunks, view_distance, (0, 0))?; thread::spawn({ let client = client.clone(); @@ -328,6 +346,17 @@ pub fn handle_play_state( // 1 sec timer let (x, y, z) = client.position(); + let (chunk_x, chunk_z) = ((x / 16.0) as i64, (z / 16.0) as i64); + let (chunk_x, chunk_z) = (chunk_x as i32, chunk_z as i32); + + set_center_chunk(client.clone(), chunk_x, chunk_z)?; + send_example_chunks_in_distance( + client.clone(), + &mut chunks, + view_distance, + (chunk_x, chunk_z), + )?; + send_system_message( client.clone(), TextComponent::rainbow(format!("Pos: {} {} {}", x as i64, y as i64, z as i64)),