feat(server): generate a cylinder of chunks around a center point

This commit is contained in:
Serkyo 2026-07-07 01:47:46 +02:00
parent 2cd3932c8d
commit 6bd8e5d3ba
2 changed files with 26 additions and 10 deletions

View file

@ -10,10 +10,7 @@ pub mod world_server;
use std::fs; use std::fs;
use shared::{ use shared::generator::{VoxelGenerator, WorldGenConfig};
generator::{VoxelGenerator, WorldGenConfig},
world::ChunkPos,
};
use tracing::{debug, info}; use tracing::{debug, info};
fn main() { fn main() {
@ -47,10 +44,5 @@ fn main() {
let mut world = world_server::ServerWorld::new(generator); let mut world = world_server::ServerWorld::new(generator);
let spawn_chunk = world.get_chunk(ChunkPos::new(0, 0, 0)); world.load_around(0.0, 0.0, 0.0, 4);
tracing::info!(
"Spawn chunk generated. Block at (0,0,0) is {}",
spawn_chunk.get(0, 0, 0).0
);
} }

View file

@ -30,4 +30,28 @@ impl ServerWorld {
.entry(pos) .entry(pos)
.or_insert_with(|| self.generator.generate_chunk(pos)) .or_insert_with(|| self.generator.generate_chunk(pos))
} }
/// Generates and caches all chunks in a cylindrical region around the given position.
pub fn load_around(&mut self, center_x: f64, center_y: f64, center_z: f64, radius: i32) {
let center = ChunkPos::from_world(center_x, center_y, center_z);
// Counts the chunks inside the cylinder that were generated or already resident.
let mut count = 0;
for x in center.x - radius..=center.x + radius {
for z in center.z - radius..=center.z + radius {
for y in center.y - radius / 2..=center.y + radius / 2 {
let dx = x - center.x;
let dz = z - center.z;
if (dx * dx + dz * dz) <= radius * radius {
self.get_chunk(ChunkPos::new(x, y, z));
count += 1;
}
}
}
}
tracing::info!(chunks = count, center = ?center, radius, "loaded chunk cylinder");
}
} }