From 3ed8d82a04860e058aa3292158fefe941be5002b Mon Sep 17 00:00:00 2001 From: griffi-gh Date: Sat, 4 May 2024 00:05:16 +0200 Subject: [PATCH] preheat chunks on server --- Server.toml | 1 + kubi-server/src/config.rs | 75 ++++++++++++++++++++------------------- kubi-server/src/main.rs | 4 +-- kubi-server/src/world.rs | 29 +++++++++++++-- 4 files changed, 67 insertions(+), 42 deletions(-) diff --git a/Server.toml b/Server.toml index 608af3f..48065e9 100644 --- a/Server.toml +++ b/Server.toml @@ -5,6 +5,7 @@ timeout_ms = 10000 [world] seed = 0xfeb_face_dead_cafe +preheat_radius = 8 [query] name = "Kubi Server" diff --git a/kubi-server/src/config.rs b/kubi-server/src/config.rs index a183674..561403d 100644 --- a/kubi-server/src/config.rs +++ b/kubi-server/src/config.rs @@ -1,37 +1,38 @@ -use shipyard::{AllStoragesView, Unique}; -use serde::{Serialize, Deserialize}; -use std::{fs, net::SocketAddr}; - -#[derive(Serialize, Deserialize)] -pub struct ConfigTableServer { - pub address: SocketAddr, - pub max_clients: usize, - pub timeout_ms: u64, - pub password: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct ConfigTableWorld { - pub seed: u64, -} - -#[derive(Serialize, Deserialize)] -pub struct ConfigTableQuery { - pub name: Option -} - -#[derive(Unique, Serialize, Deserialize)] -pub struct ConfigTable { - pub server: ConfigTableServer, - pub world: ConfigTableWorld, - pub query: ConfigTableQuery, -} - -pub fn read_config( - storages: AllStoragesView, -) { - log::info!("Reading config..."); - let config_str = fs::read_to_string("Server.toml").expect("No config file found"); - let config: ConfigTable = toml::from_str(&config_str).expect("Invalid configuration file"); - storages.add_unique(config); -} +use shipyard::{AllStoragesView, Unique}; +use serde::{Serialize, Deserialize}; +use std::{fs, net::SocketAddr}; + +#[derive(Serialize, Deserialize)] +pub struct ConfigTableServer { + pub address: SocketAddr, + pub max_clients: usize, + pub timeout_ms: u64, + pub password: Option, +} + +#[derive(Serialize, Deserialize)] +pub struct ConfigTableWorld { + pub seed: u64, + pub preheat_radius: u32, +} + +#[derive(Serialize, Deserialize)] +pub struct ConfigTableQuery { + pub name: Option +} + +#[derive(Unique, Serialize, Deserialize)] +pub struct ConfigTable { + pub server: ConfigTableServer, + pub world: ConfigTableWorld, + pub query: ConfigTableQuery, +} + +pub fn read_config( + storages: AllStoragesView, +) { + log::info!("Reading config..."); + let config_str = fs::read_to_string("Server.toml").expect("No config file found"); + let config: ConfigTable = toml::from_str(&config_str).expect("Invalid configuration file"); + storages.add_unique(config); +} diff --git a/kubi-server/src/main.rs b/kubi-server/src/main.rs index 8a216b1..790388a 100644 --- a/kubi-server/src/main.rs +++ b/kubi-server/src/main.rs @@ -1,4 +1,4 @@ -use shipyard::{World, Workload, IntoWorkload}; +use shipyard::{IntoWorkload, Workload, WorkloadModificator, World}; use std::{thread, time::Duration}; mod util; @@ -19,7 +19,7 @@ fn initialize() -> Workload { read_config, bind_server, init_client_maps, - init_world, + init_world.after_all(read_config), ).into_workload() } diff --git a/kubi-server/src/world.rs b/kubi-server/src/world.rs index 6ca5f95..dc2aa3c 100644 --- a/kubi-server/src/world.rs +++ b/kubi-server/src/world.rs @@ -1,4 +1,4 @@ -use shipyard::{Unique, UniqueView, UniqueViewMut, Workload, IntoWorkload, AllStoragesView, View, Get, NonSendSync, IntoIter}; +use shipyard::{AllStoragesView, Get, IntoIter, IntoWorkload, NonSendSync, SystemModificator, Unique, UniqueView, UniqueViewMut, View, Workload}; use glam::IVec3; use hashbrown::HashMap; use kubi_shared::{ @@ -265,10 +265,33 @@ fn init_chunk_manager_and_block_queue( storages.add_unique(LocalBlockQueue::default()); } +pub fn preheat_world( + mut chunk_manager: UniqueViewMut, + task_manager: UniqueView, + config: UniqueView, +) { + let r = config.world.preheat_radius as i32; + for x in -r..=r { + for y in -r..=r { + for z in -r..=r { + let chunk_position = IVec3::new(x, y, z); + let mut chunk = Chunk::new(); + chunk.state = ChunkState::Loading; + chunk_manager.chunks.insert(chunk_position, chunk); + task_manager.spawn_task(ChunkTask::LoadChunk { + position: chunk_position, + seed: config.world.seed, + }); + } + } + } +} + pub fn init_world() -> Workload { ( - init_chunk_manager_and_block_queue, - init_chunk_task_manager, + init_chunk_manager_and_block_queue.before_all(preheat_world), + init_chunk_task_manager.before_all(preheat_world), + preheat_world, ).into_workload() }