preheat chunks on server

This commit is contained in:
griffi-gh 2024-05-04 00:05:16 +02:00
parent c32d97b636
commit 3ed8d82a04
4 changed files with 67 additions and 42 deletions

View file

@ -5,6 +5,7 @@ timeout_ms = 10000
[world] [world]
seed = 0xfeb_face_dead_cafe seed = 0xfeb_face_dead_cafe
preheat_radius = 8
[query] [query]
name = "Kubi Server" name = "Kubi Server"

View file

@ -1,37 +1,38 @@
use shipyard::{AllStoragesView, Unique}; use shipyard::{AllStoragesView, Unique};
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
use std::{fs, net::SocketAddr}; use std::{fs, net::SocketAddr};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct ConfigTableServer { pub struct ConfigTableServer {
pub address: SocketAddr, pub address: SocketAddr,
pub max_clients: usize, pub max_clients: usize,
pub timeout_ms: u64, pub timeout_ms: u64,
pub password: Option<String>, pub password: Option<String>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct ConfigTableWorld { pub struct ConfigTableWorld {
pub seed: u64, pub seed: u64,
} pub preheat_radius: u32,
}
#[derive(Serialize, Deserialize)]
pub struct ConfigTableQuery { #[derive(Serialize, Deserialize)]
pub name: Option<String> pub struct ConfigTableQuery {
} pub name: Option<String>
}
#[derive(Unique, Serialize, Deserialize)]
pub struct ConfigTable { #[derive(Unique, Serialize, Deserialize)]
pub server: ConfigTableServer, pub struct ConfigTable {
pub world: ConfigTableWorld, pub server: ConfigTableServer,
pub query: ConfigTableQuery, pub world: ConfigTableWorld,
} pub query: ConfigTableQuery,
}
pub fn read_config(
storages: AllStoragesView, pub fn read_config(
) { storages: AllStoragesView,
log::info!("Reading config..."); ) {
let config_str = fs::read_to_string("Server.toml").expect("No config file found"); log::info!("Reading config...");
let config: ConfigTable = toml::from_str(&config_str).expect("Invalid configuration file"); let config_str = fs::read_to_string("Server.toml").expect("No config file found");
storages.add_unique(config); let config: ConfigTable = toml::from_str(&config_str).expect("Invalid configuration file");
} storages.add_unique(config);
}

View file

@ -1,4 +1,4 @@
use shipyard::{World, Workload, IntoWorkload}; use shipyard::{IntoWorkload, Workload, WorkloadModificator, World};
use std::{thread, time::Duration}; use std::{thread, time::Duration};
mod util; mod util;
@ -19,7 +19,7 @@ fn initialize() -> Workload {
read_config, read_config,
bind_server, bind_server,
init_client_maps, init_client_maps,
init_world, init_world.after_all(read_config),
).into_workload() ).into_workload()
} }

View file

@ -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 glam::IVec3;
use hashbrown::HashMap; use hashbrown::HashMap;
use kubi_shared::{ use kubi_shared::{
@ -265,10 +265,33 @@ fn init_chunk_manager_and_block_queue(
storages.add_unique(LocalBlockQueue::default()); storages.add_unique(LocalBlockQueue::default());
} }
pub fn preheat_world(
mut chunk_manager: UniqueViewMut<ChunkManager>,
task_manager: UniqueView<ChunkTaskManager>,
config: UniqueView<ConfigTable>,
) {
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 { pub fn init_world() -> Workload {
( (
init_chunk_manager_and_block_queue, init_chunk_manager_and_block_queue.before_all(preheat_world),
init_chunk_task_manager, init_chunk_task_manager.before_all(preheat_world),
preheat_world,
).into_workload() ).into_workload()
} }