infinity world

This commit is contained in:
MeexReay 2025-05-06 03:22:15 +03:00
parent 28407d2711
commit 3788bc36dd
2 changed files with 36 additions and 6 deletions

View File

@ -18,6 +18,7 @@ pub mod protocol;
#[derive(Debug)]
pub enum ServerError {
UnexpectedPacket(u8), // Неожиданный пакет
WrongPacket, // Пакет поломан, неверные данные
Protocol(ProtocolError), // Ошибка в протоколе при работе с rust_mc_proto
ConnectionClosed, // Соединение закрыто, единственная ошибка которая не логируется у handle_connection
SerTextComponent, // Ошибка при сериализации текст-компонента

View File

@ -231,7 +231,7 @@ pub fn send_keep_alive(client: Arc<ClientContext>) -> 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<ClientContext>,
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<ClientContext>, // Контекст клиента
@ -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)),