From 9a3f53c32c4beaaa12f8f68e0700e72cddc608dd Mon Sep 17 00:00:00 2001 From: Maxicarlos08 Date: Tue, 26 Sep 2023 00:27:46 +0200 Subject: [PATCH 1/5] added status updates to loading screen --- Cargo.lock | 1 + assets/voxygen/i18n/en/hud/misc.ftl | 8 ++++ client/Cargo.toml | 1 + client/src/lib.rs | 30 ++++++++++++++ voxygen/src/menu/main/client_init.rs | 10 ++++- voxygen/src/menu/main/mod.rs | 28 +++++++++---- voxygen/src/menu/main/ui/connecting.rs | 54 ++++++++++++++++++++++---- voxygen/src/menu/main/ui/mod.rs | 17 ++++++++ 8 files changed, 134 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 46ea56fcca..543bfe3b2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6785,6 +6785,7 @@ dependencies = [ "authc", "byteorder", "clap", + "crossbeam-channel", "hashbrown 0.13.2", "image", "num 0.4.1", diff --git a/assets/voxygen/i18n/en/hud/misc.ftl b/assets/voxygen/i18n/en/hud/misc.ftl index cc99b03fe2..b4656f251e 100644 --- a/assets/voxygen/i18n/en/hud/misc.ftl +++ b/assets/voxygen/i18n/en/hud/misc.ftl @@ -60,3 +60,11 @@ hud-stay= Stay hud-sit = Sit hud-steer = Steer hud-portal = Portal +hud-init-stage-singleplayer = Starting singleplayer server... +hud-init-stage-multiplayer = Starting multiplayer +hud-init-stage-client-connection-establish = Establishing connection to server +hud-init-stage-client-request-server-version = Wating for server version +hud-init-stage-client-authentication = Authenticating +hud-init-stage-client-load-init-data = Loading initialization data from server +hud-init-stage-client-starting-client = Preparing Client... +hud-init-stage-render-pipeline = Creating render pipeline ({ $done }/{ $total }) diff --git a/client/Cargo.toml b/client/Cargo.toml index f459225045..30c94e5e23 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -30,6 +30,7 @@ tracing = { workspace = true } rayon = { workspace = true } specs = { workspace = true, features = ["serde", "storage-event-control", "derive"] } vek = { workspace = true } +crossbeam-channel = { workspace = true } hashbrown = { workspace = true } authc = { git = "https://gitlab.com/veloren/auth.git", rev = "abb1a705827984e11706d7bb97fb7a459e1e6533" } # xMAC94x/current_master_till_refactored branch diff --git a/client/src/lib.rs b/client/src/lib.rs index f19d253afa..d5bfcbe50b 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -66,6 +66,7 @@ use common_net::{ use common_state::State; use common_systems::add_local_systems; use comp::BuffKind; +use crossbeam_channel::Sender; use hashbrown::{HashMap, HashSet}; use image::DynamicImage; use network::{ConnectAddr, Network, Participant, Pid, Stream}; @@ -115,6 +116,22 @@ pub enum Event { SpectatePosition(Vec3), } +#[derive(Debug)] +pub enum ClientInitStage { + /// A connection to the server is being created + ConnectionEstablish, + /// Waiting for server version + WatingForServerVersion, + /// We're currently authenticating with the server + Authentication, + /// Loading map data, site information, recipe information and other + /// initialization data + LoadingInitData, + /// Prepare data received by the server to be used by the client (insert + /// data into the ECS, render map) + StartingClient, +} + pub struct WorldData { /// Just the "base" layer for LOD; currently includes colors and nothing /// else. In the future we'll add more layers, like shadows, rivers, and @@ -290,9 +307,17 @@ impl Client { username: &str, password: &str, auth_trusted: impl FnMut(&str) -> bool, + init_stage_update: Option>, ) -> Result { + let update_stage = |stage: ClientInitStage| { + if let Some(updater) = &init_stage_update { + let _ = updater.send(stage); + } + }; + let network = Network::new(Pid::new(), &runtime); + update_stage(ClientInitStage::ConnectionEstablish); let mut participant = match addr { ConnectionArgs::Tcp { hostname, @@ -322,6 +347,7 @@ impl Client { let in_game_stream = participant.opened().await?; let terrain_stream = participant.opened().await?; + update_stage(ClientInitStage::WatingForServerVersion); register_stream.send(ClientType::Game)?; let server_info: ServerInfo = register_stream.recv().await?; if server_info.git_hash != *common::util::GIT_HASH { @@ -340,6 +366,7 @@ impl Client { ping_stream.send(PingMsg::Ping)?; + update_stage(ClientInitStage::Authentication); // Register client Self::register( username, @@ -350,6 +377,7 @@ impl Client { ) .await?; + update_stage(ClientInitStage::LoadingInitData); // Wait for initial sync let mut ping_interval = tokio::time::interval(Duration::from_secs(1)); let ServerInit::GameSync { @@ -373,6 +401,7 @@ impl Client { } }; + update_stage(ClientInitStage::StartingClient); // Spawn in a blocking thread (leaving the network thread free). This is mostly // useful for bots. let mut task = tokio::task::spawn_blocking(move || { @@ -2978,6 +3007,7 @@ mod tests { username, password, |suggestion: &str| suggestion == auth_server, + None, )); let localisation = LocalizationHandle::load_expect("en"); diff --git a/voxygen/src/menu/main/client_init.rs b/voxygen/src/menu/main/client_init.rs index cf5ab2daf2..55720bfcc8 100644 --- a/voxygen/src/menu/main/client_init.rs +++ b/voxygen/src/menu/main/client_init.rs @@ -1,7 +1,7 @@ use client::{ addr::ConnectionArgs, error::{Error as ClientError, NetworkConnectError, NetworkError}, - Client, ServerInfo, + Client, ClientInitStage, ServerInfo, }; use crossbeam_channel::{unbounded, Receiver, Sender, TryRecvError}; use std::{ @@ -39,6 +39,7 @@ pub struct AuthTrust(String, bool); // server). pub struct ClientInit { rx: Receiver, + stage_rx: Receiver, trust_tx: Sender, cancel: Arc, } @@ -51,6 +52,7 @@ impl ClientInit { ) -> Self { let (tx, rx) = unbounded(); let (trust_tx, trust_rx) = unbounded(); + let (init_stage_tx, init_stare_rx) = unbounded(); let cancel = Arc::new(AtomicBool::new(false)); let cancel2 = Arc::clone(&cancel); @@ -73,6 +75,7 @@ impl ClientInit { break; } let mut mismatched_server_info = None; + let new_init_tx = init_stage_tx.clone(); match Client::new( connection_args.clone(), Arc::clone(&runtime2), @@ -80,6 +83,7 @@ impl ClientInit { &username, &password, trust_fn, + Some(new_init_tx), ) .await { @@ -116,6 +120,7 @@ impl ClientInit { ClientInit { rx, + stage_rx: init_stare_rx, trust_tx, cancel, } @@ -132,6 +137,9 @@ impl ClientInit { } } + /// Poll for connection stage updates from the client + pub fn stage_update(&self) -> Option { self.stage_rx.try_recv().ok() } + /// Report trust status of auth server pub fn auth_trust(&self, auth_server: String, trusted: bool) { let _ = self.trust_tx.send(AuthTrust(auth_server, trusted)); diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index cf01b5baea..809ca63e07 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -14,7 +14,7 @@ use crate::{ use client::{ addr::ConnectionArgs, error::{InitProtocolError, NetworkConnectError, NetworkError}, - Client, ServerInfo, + Client, ClientInitStage, ServerInfo, }; use client_init::{ClientInit, Error as InitError, Msg as InitMsg}; use common::comp; @@ -26,6 +26,14 @@ use tokio::runtime; use tracing::error; use ui::{Event as MainMenuEvent, MainMenuUi}; +pub enum DetailedInitializationStage { + // TODO: Map generation and server startup progress + Singleplayer, + StartingMultiplayer, + Client(ClientInitStage), + CreatingRenderPipeline(usize, usize), +} + // TODO: show status messages for waiting on server creation, client init, and // pipeline creation (we can show progress of pipeline creation) enum InitState { @@ -187,6 +195,12 @@ impl PlayState for MainMenuState { _ => {}, } } + + if let Some(client_stage_update) = self.init.client().and_then(|init| init.stage_update()) { + self.main_menu_ui + .update_stage(DetailedInitializationStage::Client(client_stage_update)); + } + // Poll client creation. match self.init.client().and_then(|init| init.poll()) { Some(InitMsg::Done(Ok(mut client))) => { @@ -263,13 +277,13 @@ impl PlayState for MainMenuState { // Poll renderer pipeline creation if let InitState::Pipeline(..) = &self.init { - // If not complete go to char select screen - if global_state - .window - .renderer() - .pipeline_creation_status() - .is_none() + if let Some((done, total)) = &global_state.window.renderer().pipeline_creation_status() { + self.main_menu_ui.update_stage( + DetailedInitializationStage::CreatingRenderPipeline(*done, *total), + ); + // If complete go to char select screen + } else { // Always succeeds since we check above if let InitState::Pipeline(client) = core::mem::replace(&mut self.init, InitState::None) diff --git a/voxygen/src/menu/main/ui/connecting.rs b/voxygen/src/menu/main/ui/connecting.rs index 6778d52918..6bae83df3e 100644 --- a/voxygen/src/menu/main/ui/connecting.rs +++ b/voxygen/src/menu/main/ui/connecting.rs @@ -2,6 +2,7 @@ use super::{ConnectionState, Imgs, Message}; use crate::{ game_input::GameInput, + menu::main::DetailedInitializationStage, settings::ControlSettings, ui::{ fonts::IcedFonts as Fonts, @@ -9,6 +10,7 @@ use crate::{ Graphic, }, }; +use client::ClientInitStage; use common::assets::{self, AssetExt}; use i18n::Localization; use iced::{button, Align, Column, Container, Length, Row, Space, Text}; @@ -85,6 +87,7 @@ impl Screen { fonts: &Fonts, imgs: &Imgs, connection_state: &ConnectionState, + init_stage: &DetailedInitializationStage, time: f64, i18n: &Localization, button_style: style::button::Style, @@ -133,6 +136,46 @@ impl Screen { Space::new(Length::Fill, Length::Fill).into() }; + let stage = { + let stage_message = match init_stage { + DetailedInitializationStage::Singleplayer => { + i18n.get_msg("hud-init-stage-singleplayer") + }, + DetailedInitializationStage::StartingMultiplayer => { + i18n.get_msg("hud-init-stage-multiplayer") + }, + DetailedInitializationStage::Client(client_stage) => match client_stage { + ClientInitStage::ConnectionEstablish => { + i18n.get_msg("hud-init-stage-client-connection-establish") + }, + ClientInitStage::WatingForServerVersion => { + i18n.get_msg("hud-init-stage-client-request-server-version") + }, + ClientInitStage::Authentication => { + i18n.get_msg("hud-init-stage-client-authentication") + }, + ClientInitStage::LoadingInitData => { + i18n.get_msg("hud-init-stage-client-load-init-data") + }, + ClientInitStage::StartingClient => { + i18n.get_msg("hud-init-stage-client-starting-client") + }, + }, + DetailedInitializationStage::CreatingRenderPipeline(done, total) => i18n + .get_msg_ctx( + "hud-init-stage-render-pipeline", + &i18n::fluent_args! { "done" => done, "total" => total }, + ), + }; + + Container::new(Text::new(stage_message).size(fonts.cyri.scale(25))) + .width(Length::Fill) + .height(Length::Fill) + .padding(10) + .align_y(Align::End) + .into() + }; + let cancel = Container::new(neat_button( &mut self.cancel_button, i18n.get_msg("common-cancel"), @@ -160,13 +203,10 @@ impl Screen { .padding(10) .align_x(Align::End); - let bottom_content = Row::with_children(vec![ - Space::new(Length::Fill, Length::Shrink).into(), - tip_cancel.into(), - gear.into(), - ]) - .align_items(Align::Center) - .width(Length::Fill); + let bottom_content = + Row::with_children(vec![stage, tip_cancel.into(), gear.into()]) + .align_items(Align::Center) + .width(Length::Fill); let left_art = Image::new(imgs.loading_art_l) .width(Length::Units(12)) diff --git a/voxygen/src/menu/main/ui/mod.rs b/voxygen/src/menu/main/ui/mod.rs index 06fe475b82..e2b65c8457 100644 --- a/voxygen/src/menu/main/ui/mod.rs +++ b/voxygen/src/menu/main/ui/mod.rs @@ -29,6 +29,8 @@ use rand::{seq::SliceRandom, thread_rng}; use std::time::Duration; use tracing::warn; +use super::DetailedInitializationStage; + // TODO: what is this? (showed up in rebase) //const COL1: Color = Color::Rgba(0.07, 0.1, 0.1, 0.9); @@ -179,6 +181,7 @@ enum Screen { Connecting { screen: connecting::Screen, connection_state: ConnectionState, + init_stage: DetailedInitializationStage, }, #[cfg(feature = "singleplayer")] WorldSelector { @@ -405,10 +408,12 @@ impl Controls { Screen::Connecting { screen, connection_state, + init_stage, } => screen.view( &self.fonts, &self.imgs, connection_state, + init_stage, self.time, &self.i18n.read(), button_style, @@ -480,6 +485,7 @@ impl Controls { self.screen = Screen::Connecting { screen: connecting::Screen::new(ui), connection_state: ConnectionState::InProgress, + init_stage: DetailedInitializationStage::Singleplayer, }; events.push(Event::StartSingleplayer); }, @@ -520,6 +526,7 @@ impl Controls { self.screen = Screen::Connecting { screen: connecting::Screen::new(ui), connection_state: ConnectionState::InProgress, + init_stage: DetailedInitializationStage::StartingMultiplayer, }; events.push(Event::LoginAttempt { @@ -629,6 +636,12 @@ impl Controls { } } + fn init_stage(&mut self, stage: DetailedInitializationStage) { + if let Screen::Connecting { init_stage, .. } = &mut self.screen { + *init_stage = stage + } + } + fn tab(&mut self) { if let Screen::Login { screen, .. } = &mut self.screen { // TODO: add select all function in iced @@ -714,6 +727,10 @@ impl MainMenuUi { pub fn show_info(&mut self, msg: String) { self.controls.connection_error(msg); } + pub fn update_stage(&mut self, stage: DetailedInitializationStage) { + self.controls.init_stage(stage); + } + pub fn connected(&mut self) { self.controls.exit_connect_screen(); } pub fn cancel_connection(&mut self) { self.controls.exit_connect_screen(); } From 66f6b81575dadfff09ea159d454195dcdd32abda Mon Sep 17 00:00:00 2001 From: Maxicarlos08 Date: Thu, 28 Sep 2023 00:26:47 +0200 Subject: [PATCH 2/5] singleplayer server initialization status --- assets/voxygen/i18n/en/common.ftl | 2 ++ assets/voxygen/i18n/en/hud/misc.ftl | 18 ++++++++---- server-cli/src/main.rs | 1 + server/src/lib.rs | 26 ++++++++++++++++++ voxygen/benches/meshing_benchmark.rs | 1 + voxygen/src/menu/main/mod.rs | 8 ++++++ voxygen/src/menu/main/ui/connecting.rs | 38 ++++++++++++++++++++++++++ voxygen/src/singleplayer/mod.rs | 7 ++++- world/examples/dungeon_voxel_export.rs | 2 ++ world/examples/pricing_csv.rs | 3 +- world/examples/view.rs | 6 +++- world/examples/water.rs | 3 +- world/examples/world_generate_time.rs | 3 +- world/src/civ/mod.rs | 19 +++++++++++-- world/src/lib.rs | 30 ++++++++++++++++++-- world/src/sim/erosion.rs | 3 ++ world/src/sim/mod.rs | 19 ++++++++++++- world/src/site/economy/context.rs | 17 ++++++++---- 18 files changed, 185 insertions(+), 21 deletions(-) diff --git a/assets/voxygen/i18n/en/common.ftl b/assets/voxygen/i18n/en/common.ftl index 0b69c4d703..6d304bfdbc 100644 --- a/assets/voxygen/i18n/en/common.ftl +++ b/assets/voxygen/i18n/en/common.ftl @@ -2,6 +2,8 @@ common-username = username common-singleplayer = Singleplayer common-multiplayer = Multiplayer common-servers = Servers +common-server = Server +common-client = Client common-quit = Quit common-settings = Settings common-languages = Languages diff --git a/assets/voxygen/i18n/en/hud/misc.ftl b/assets/voxygen/i18n/en/hud/misc.ftl index b4656f251e..9dfc2a1254 100644 --- a/assets/voxygen/i18n/en/hud/misc.ftl +++ b/assets/voxygen/i18n/en/hud/misc.ftl @@ -61,10 +61,18 @@ hud-sit = Sit hud-steer = Steer hud-portal = Portal hud-init-stage-singleplayer = Starting singleplayer server... +hud-init-stage-server-db-migrations = [{ common-server }]: Applying database migrations +hud-init-stage-server-db-vacuum = [{ common-server }]: Cleaning up database +hud-init-stage-server-worldsim-erosion = [{ common-server }]: Erosion { $percentage }% +hud-init-stage-server-worldciv-civcreate = [{ common-server }]: Generated { $generated } out of { $total } civilizations +hud-init-stage-server-worldciv-site = [{ common-server }]: Generating sites +hud-init-stage-server-economysim = [{ common-server }]: Simulating economy +hud-init-stage-server-spotgen = [{ common-server }]: Generating spots +hud-init-stage-server-starting = [{ common-server }]: Starting server... hud-init-stage-multiplayer = Starting multiplayer -hud-init-stage-client-connection-establish = Establishing connection to server -hud-init-stage-client-request-server-version = Wating for server version -hud-init-stage-client-authentication = Authenticating -hud-init-stage-client-load-init-data = Loading initialization data from server -hud-init-stage-client-starting-client = Preparing Client... +hud-init-stage-client-connection-establish = [{ common-client }]: Establishing connection to server +hud-init-stage-client-request-server-version = [{ common-client }]: Wating for server version +hud-init-stage-client-authentication = [{ common-client }]: Authenticating +hud-init-stage-client-load-init-data = [{ common-client }]: Loading initialization data from server +hud-init-stage-client-starting-client = [{ common-client }]: Preparing Client... hud-init-stage-render-pipeline = Creating render pipeline ({ $done }/{ $total }) diff --git a/server-cli/src/main.rs b/server-cli/src/main.rs index c3e6cf2092..1a26846b3e 100644 --- a/server-cli/src/main.rs +++ b/server-cli/src/main.rs @@ -192,6 +192,7 @@ fn main() -> io::Result<()> { editable_settings, database_settings, &server_data_dir, + None, runtime, ) .expect("Failed to create server instance!"); diff --git a/server/src/lib.rs b/server/src/lib.rs index ce54a4e997..a86271834b 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -112,11 +112,13 @@ use test_world::{IndexOwned, World}; use tokio::{runtime::Runtime, sync::Notify}; use tracing::{debug, error, info, trace, warn}; use vek::*; +pub use world::{civ::WorldCivStage, sim::WorldSimStage, WorldGenerateStage}; use crate::{ persistence::{DatabaseSettings, SqlLogMode}, sys::terrain, }; +use crossbeam_channel::Sender; use hashbrown::HashMap; use std::sync::RwLock; @@ -198,6 +200,13 @@ pub struct ChunkRequest { key: Vec2, } +pub enum ServerInitStage { + DbMigrations, + DbVacuum, + WorldGen(WorldGenerateStage), + StartingSystems, +} + pub struct Server { state: State, world: Arc, @@ -221,6 +230,7 @@ impl Server { editable_settings: EditableSettings, database_settings: DatabaseSettings, data_dir: &std::path::Path, + stage_report_tx: Option>, runtime: Arc, ) -> Result { prof_span!("Server::new"); @@ -229,10 +239,18 @@ impl Server { info!("Authentication is disabled"); } + let report_stage = |stage: ServerInitStage| { + if let Some(stage_report_tx) = &stage_report_tx { + let _ = stage_report_tx.send(stage); + } + }; + + report_stage(ServerInitStage::DbMigrations); // Run pending DB migrations (if any) debug!("Running DB migrations..."); persistence::run_migrations(&database_settings); + report_stage(ServerInitStage::DbVacuum); // Vacuum database debug!("Vacuuming database..."); persistence::vacuum_database(&database_settings); @@ -253,6 +271,7 @@ impl Server { let pools = State::pools(GameMode::Server); + let world_generate_status_tx = stage_report_tx.clone(); #[cfg(feature = "worldgen")] let (world, index) = World::generate( settings.world_seed, @@ -267,6 +286,11 @@ impl Server { calendar: Some(settings.calendar_mode.calendar_now()), }, &pools, + Arc::new(move |stage| { + if let Some(stage_report_tx) = &world_generate_status_tx { + let _ = stage_report_tx.send(ServerInitStage::WorldGen(stage)); + } + }), ); #[cfg(not(feature = "worldgen"))] let (world, index) = World::generate(settings.world_seed); @@ -287,6 +311,8 @@ impl Server { let lod = lod::Lod::from_world(&world, index.as_index_ref(), &pools); + report_stage(ServerInitStage::StartingSystems); + let mut state = State::server( pools, world.sim().map_size_lg(), diff --git a/voxygen/benches/meshing_benchmark.rs b/voxygen/benches/meshing_benchmark.rs index 9d6d250def..cdcc8c442e 100644 --- a/voxygen/benches/meshing_benchmark.rs +++ b/voxygen/benches/meshing_benchmark.rs @@ -25,6 +25,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { calendar: None, }, &pool, + Arc::new(|_| {}), ); let mut terrain = TerrainGrid::new( world.sim().map_size_lg(), diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 809ca63e07..be1e9833a1 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -21,6 +21,7 @@ use common::comp; use common_base::span; use i18n::LocalizationHandle; use scene::Scene; +use server::ServerInitStage; use std::sync::Arc; use tokio::runtime; use tracing::error; @@ -29,6 +30,7 @@ use ui::{Event as MainMenuEvent, MainMenuUi}; pub enum DetailedInitializationStage { // TODO: Map generation and server startup progress Singleplayer, + SingleplayerServer(ServerInitStage), StartingMultiplayer, Client(ClientInitStage), CreatingRenderPipeline(usize, usize), @@ -106,6 +108,12 @@ impl PlayState for MainMenuState { #[cfg(feature = "singleplayer")] { if let Some(singleplayer) = global_state.singleplayer.as_running() { + if let Ok(stage_update) = singleplayer.init_stage_receiver.try_recv() { + self.main_menu_ui.update_stage( + DetailedInitializationStage::SingleplayerServer(stage_update), + ); + } + match singleplayer.receiver.try_recv() { Ok(Ok(())) => { // Attempt login after the server is finished initializing diff --git a/voxygen/src/menu/main/ui/connecting.rs b/voxygen/src/menu/main/ui/connecting.rs index 6bae83df3e..8db3fb3efd 100644 --- a/voxygen/src/menu/main/ui/connecting.rs +++ b/voxygen/src/menu/main/ui/connecting.rs @@ -16,6 +16,7 @@ use i18n::Localization; use iced::{button, Align, Column, Container, Length, Row, Space, Text}; use keyboard_keynames::key_layout::KeyLayout; use serde::{Deserialize, Serialize}; +use server::{ServerInitStage, WorldCivStage, WorldGenerateStage, WorldSimStage}; struct LoadingAnimation { speed_factor: f32, @@ -141,6 +142,43 @@ impl Screen { DetailedInitializationStage::Singleplayer => { i18n.get_msg("hud-init-stage-singleplayer") }, + DetailedInitializationStage::SingleplayerServer(server_stage) => { + match server_stage { + ServerInitStage::DbMigrations => { + i18n.get_msg("hud-init-stage-server-db-migrations") + }, + ServerInitStage::DbVacuum => { + i18n.get_msg("hud-init-stage-server-db-vacuum") + }, + ServerInitStage::WorldGen(worldgen_stage) => match worldgen_stage { + WorldGenerateStage::WorldSimGenerate(worldsim_stage) => { + match worldsim_stage { + WorldSimStage::Erosion(done) => i18n + .get_msg_ctx( + "hud-init-stage-server-worldsim-erosion", + &i18n::fluent_args! { "percentage" => format!("{done:.0}") } + ), + } + }, + WorldGenerateStage::WorldCivGenerate(worldciv_stage) => { + match worldciv_stage { + WorldCivStage::CivCreation(generated, total) => i18n + .get_msg_ctx( + "hud-init-stage-server-worldciv-civcreate", + &i18n::fluent_args! { + "generated" => generated.to_string(), + "total" => total.to_string(), + } + ), + WorldCivStage::SiteGeneration => i18n.get_msg("hud-init-stage-server-worldciv-site"), + } + }, + WorldGenerateStage::EconomySimulation => i18n.get_msg("hud-init-stage-server-economysim"), + WorldGenerateStage::SpotGeneration => i18n.get_msg("hud-init-stage-server-spotgen"), + }, + ServerInitStage::StartingSystems => i18n.get_msg("hud-init-stage-server-starting"), + } + }, DetailedInitializationStage::StartingMultiplayer => { i18n.get_msg("hud-init-stage-multiplayer") }, diff --git a/voxygen/src/singleplayer/mod.rs b/voxygen/src/singleplayer/mod.rs index 95f67401b7..7d6fa7f84d 100644 --- a/voxygen/src/singleplayer/mod.rs +++ b/voxygen/src/singleplayer/mod.rs @@ -2,7 +2,7 @@ use common::clock::Clock; use crossbeam_channel::{bounded, unbounded, Receiver, Sender, TryRecvError}; use server::{ persistence::{DatabaseSettings, SqlLogMode}, - Error as ServerError, Event, Input, Server, + Error as ServerError, Event, Input, Server, ServerInitStage, }; use std::{ sync::{ @@ -26,6 +26,7 @@ pub struct Singleplayer { _server_thread: JoinHandle<()>, stop_server_s: Sender<()>, pub receiver: Receiver>, + pub init_stage_receiver: Receiver, // Wether the server is stopped or not paused: Arc, } @@ -89,6 +90,8 @@ impl SingleplayerState { let (stop_server_s, stop_server_r) = unbounded(); + let (server_stage_tx, server_stage_rx) = unbounded(); + // Create server // Relative to data_dir @@ -119,6 +122,7 @@ impl SingleplayerState { editable_settings, database_settings, &server_data_dir, + Some(server_stage_tx), runtime, ) { Ok(server) => (Some(server), Ok(())), @@ -143,6 +147,7 @@ impl SingleplayerState { *self = SingleplayerState::Running(Singleplayer { _server_thread: thread, stop_server_s, + init_stage_receiver: server_stage_rx, receiver: result_receiver, paused, }); diff --git a/world/examples/dungeon_voxel_export.rs b/world/examples/dungeon_voxel_export.rs index 8c6b7841aa..d96570a176 100644 --- a/world/examples/dungeon_voxel_export.rs +++ b/world/examples/dungeon_voxel_export.rs @@ -2,6 +2,7 @@ use std::{ collections::HashMap, fs::File, io::{prelude::*, SeekFrom}, + sync::Arc, }; type Result = std::io::Result<()>; @@ -32,6 +33,7 @@ fn main() -> Result { calendar: None, }, &pool, + Arc::new(|_| {}), ); println!("Loaded world"); let export_path = "dungeon.vox"; diff --git a/world/examples/pricing_csv.rs b/world/examples/pricing_csv.rs index f522ee7da5..54e12cf174 100644 --- a/world/examples/pricing_csv.rs +++ b/world/examples/pricing_csv.rs @@ -4,7 +4,7 @@ use common::{ }; use rayon::ThreadPoolBuilder; use rusqlite::{Connection, ToSql}; -use std::error::Error; +use std::{error::Error, sync::Arc}; use strum::IntoEnumIterator; use vek::Vec2; use veloren_world::{ @@ -169,6 +169,7 @@ fn main() { calendar: None, }, &pool, + Arc::new(|_| {}), ); println!("Loaded world"); diff --git a/world/examples/view.rs b/world/examples/view.rs index 3cf3658697..b4bda62152 100644 --- a/world/examples/view.rs +++ b/world/examples/view.rs @@ -1,4 +1,7 @@ -use std::ops::{Add, Mul, Sub}; +use std::{ + ops::{Add, Mul, Sub}, + sync::Arc, +}; use vek::*; use veloren_world::{sim::WorldOpts, util::Sampler, World}; @@ -14,6 +17,7 @@ fn main() { ..WorldOpts::default() }, &threadpool, + Arc::new(|_| {}), ); let index = index.as_index_ref(); diff --git a/world/examples/water.rs b/world/examples/water.rs index 3a27760688..cf020c07e0 100644 --- a/world/examples/water.rs +++ b/world/examples/water.rs @@ -7,7 +7,7 @@ use common::{ vol::RectVolSize, }; use rayon::prelude::*; -use std::{f64, io::Write, path::PathBuf, time::SystemTime}; +use std::{f64, io::Write, path::PathBuf, sync::Arc, time::SystemTime}; use tracing::{warn, Level}; use tracing_subscriber::{ filter::{EnvFilter, LevelFilter}, @@ -53,6 +53,7 @@ fn main() { calendar: None, }, &threadpool, + Arc::new(|_| {}), ); let index = index.as_index_ref(); tracing::info!("Sampling data..."); diff --git a/world/examples/world_generate_time.rs b/world/examples/world_generate_time.rs index 63593223f8..012e5cbd73 100644 --- a/world/examples/world_generate_time.rs +++ b/world/examples/world_generate_time.rs @@ -1,4 +1,4 @@ -use std::time::Instant; +use std::{sync::Arc, time::Instant}; use veloren_world::{ sim::{FileOpts, WorldOpts, DEFAULT_WORLD_MAP}, World, @@ -17,6 +17,7 @@ fn main() { calendar: None, }, &threadpool, + Arc::new(|_| {}), ); core::hint::black_box((world, index)); println!("{} ms", start.elapsed().as_nanos() / 1_000_000); diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index 27a4bd8f20..c02a04ac76 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -27,6 +27,7 @@ use core::{fmt, hash::BuildHasherDefault, ops::Range}; use fxhash::FxHasher64; use rand::prelude::*; use rand_chacha::ChaChaRng; +use std::sync::Arc; use tracing::{debug, info, warn}; use vek::*; @@ -223,8 +224,20 @@ impl<'a, R: Rng> GenCtx<'a, R> { } } +pub enum WorldCivStage { + /// Civilization creation, how many out of how many civilizations have been + /// generated yet + CivCreation(u32, u32), + SiteGeneration, +} + impl Civs { - pub fn generate(seed: u32, sim: &mut WorldSim, index: &mut Index) -> Self { + pub fn generate( + seed: u32, + sim: &mut WorldSim, + index: &mut Index, + report_stage: Arc, + ) -> Self { prof_span!("Civs::generate"); let mut this = Self::default(); let rng = ChaChaRng::from_seed(seed_expan::rng_state(seed)); @@ -247,16 +260,18 @@ impl Civs { info!("starting civilisation creation"); prof_span!(guard, "create civs"); - for _ in 0..initial_civ_count { + for i in 0..initial_civ_count { prof_span!("create civ"); debug!("Creating civilisation..."); if this.birth_civ(&mut ctx.reseed()).is_none() { warn!("Failed to find starting site for civilisation."); } + report_stage(WorldCivStage::CivCreation(i, initial_civ_count)); } drop(guard); info!(?initial_civ_count, "all civilisations created"); + report_stage(WorldCivStage::SiteGeneration); prof_span!(guard, "find locations and establish sites"); let world_dims = ctx.sim.get_aabr(); for _ in 0..initial_civ_count * 3 { diff --git a/world/src/lib.rs b/world/src/lib.rs index f64898bd18..f0fd5f266d 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -32,9 +32,11 @@ pub use crate::{ layer::PathLocals, }; pub use block::BlockGen; +use civ::WorldCivStage; pub use column::ColumnSample; pub use common::terrain::site::{DungeonKindMeta, SettlementKindMeta}; pub use index::{IndexOwned, IndexRef}; +use sim::WorldSimStage; use crate::{ column::ColumnGen, @@ -62,7 +64,7 @@ use enum_map::EnumMap; use rand::{prelude::*, Rng}; use rand_chacha::ChaCha8Rng; use serde::Deserialize; -use std::time::Duration; +use std::{sync::Arc, time::Duration}; use vek::*; #[cfg(all(feature = "be-dyn-lib", feature = "use-dyn-lib"))] @@ -85,6 +87,13 @@ pub enum Error { Other(String), } +pub enum WorldGenerateStage { + WorldSimGenerate(WorldSimStage), + WorldCivGenerate(WorldCivStage), + EconomySimulation, + SpotGeneration, +} + pub struct World { sim: sim::WorldSim, civs: civ::Civs, @@ -110,6 +119,7 @@ impl World { seed: u32, opts: sim::WorldOpts, threadpool: &rayon::ThreadPool, + report_stage: Arc, ) -> (Self, IndexOwned) { prof_span!("World::generate"); // NOTE: Generating index first in order to quickly fail if the color manifest @@ -117,12 +127,26 @@ impl World { threadpool.install(|| { let mut index = Index::new(seed); - let mut sim = sim::WorldSim::generate(seed, opts, threadpool); + let sim_stage_tx = Arc::clone(&report_stage); + let mut sim = sim::WorldSim::generate( + seed, + opts, + threadpool, + Arc::new(move |stage| sim_stage_tx(WorldGenerateStage::WorldSimGenerate(stage))), + ); - let civs = civ::Civs::generate(seed, &mut sim, &mut index); + let civ_stage_tx = Arc::clone(&report_stage); + let civs = civ::Civs::generate( + seed, + &mut sim, + &mut index, + Arc::new(move |stage| civ_stage_tx(WorldGenerateStage::WorldCivGenerate(stage))), + ); + report_stage(WorldGenerateStage::EconomySimulation); sim2::simulate(&mut index, &mut sim); + report_stage(WorldGenerateStage::SpotGeneration); Spot::generate(&mut sim); (Self { sim, civs }, IndexOwned::new(index)) diff --git a/world/src/sim/erosion.rs b/world/src/sim/erosion.rs index c2ec8fe09b..b6f987f088 100644 --- a/world/src/sim/erosion.rs +++ b/world/src/sim/erosion.rs @@ -19,6 +19,7 @@ use std::{ cmp::{Ordering, Reverse}, collections::BinaryHeap, f32, fmt, mem, + rc::Rc, time::Instant, u32, }; @@ -2540,6 +2541,7 @@ pub fn do_erosion( k_d_scale: f64, k_da_scale: impl Fn(f64) -> f64, threadpool: &rayon::ThreadPool, + report_progress: Rc, ) -> (Box<[Alt]>, Box<[Alt]> /* , Box<[Alt]> */) { debug!("Initializing erosion arrays..."); let oldh_ = (0..map_size_lg.chunks_len()) @@ -2644,6 +2646,7 @@ pub fn do_erosion( // Print out the percentage complete. Do this at most 20 times. if i % std::cmp::max(n_steps / 20, 1) == 0 { let pct = (i as f64 / n_steps as f64) * 100.0; + report_progress(pct); info!("{:.2}% complete", pct); } diff --git a/world/src/sim/mod.rs b/world/src/sim/mod.rs index 22d5d6397f..460da29b8b 100644 --- a/world/src/sim/mod.rs +++ b/world/src/sim/mod.rs @@ -69,6 +69,7 @@ use std::{ io::{BufReader, BufWriter}, ops::{Add, Div, Mul, Neg, Sub}, path::PathBuf, + rc::Rc, sync::Arc, }; use strum::IntoEnumIterator; @@ -645,6 +646,11 @@ impl WorldFile { } } +pub enum WorldSimStage { + // TODO: Add more stages + Erosion(f64), +} + pub struct WorldSim { pub seed: u32, /// Base 2 logarithm of the map size. @@ -663,7 +669,12 @@ pub struct WorldSim { } impl WorldSim { - pub fn generate(seed: u32, opts: WorldOpts, threadpool: &rayon::ThreadPool) -> Self { + pub fn generate( + seed: u32, + opts: WorldOpts, + threadpool: &rayon::ThreadPool, + stage_report: Arc, + ) -> Self { prof_span!("WorldSim::generate"); let calendar = opts.calendar; // separate lifetime of elements let world_file = opts.world_file; @@ -1250,6 +1261,9 @@ impl WorldSim { // Perform some erosion. + let report_erosion: Rc = + Rc::new(move |progress: f64| stage_report(WorldSimStage::Erosion(progress))); + let (alt, basement) = if let Some(map) = parsed_world_file { (map.alt, map.basement) } else { @@ -1278,6 +1292,7 @@ impl WorldSim { k_d_scale(n_approx), k_da_scale, threadpool, + Rc::clone(&report_erosion), ); // Quick "small scale" erosion cycle in order to lower extreme angles. @@ -1302,6 +1317,7 @@ impl WorldSim { k_d_scale(n_approx), k_da_scale, threadpool, + Rc::clone(&report_erosion), ) }; @@ -1351,6 +1367,7 @@ impl WorldSim { k_d_scale(n_approx), k_da_scale, threadpool, + Rc::clone(&report_erosion), ) }; diff --git a/world/src/site/economy/context.rs b/world/src/site/economy/context.rs index df60ad86ce..dfcdd70fff 100644 --- a/world/src/site/economy/context.rs +++ b/world/src/site/economy/context.rs @@ -328,6 +328,8 @@ mod tests { #[test] #[ignore] fn test_economy0() { + use std::sync::Arc; + execute_with_tracing(Level::INFO, || { let threadpool = rayon::ThreadPoolBuilder::new().build().unwrap(); info!("init"); @@ -340,9 +342,9 @@ mod tests { }; let mut index = crate::index::Index::new(seed); info!("Index created"); - let mut sim = sim::WorldSim::generate(seed, opts, &threadpool); + let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, Arc::new(|_| {})); info!("World loaded"); - let _civs = crate::civ::Civs::generate(seed, &mut sim, &mut index); + let _civs = crate::civ::Civs::generate(seed, &mut sim, &mut index, Arc::new(|_| {})); info!("Civs created"); crate::sim2::simulate(&mut index, &mut sim); show_economy(&index.sites, &None); @@ -354,6 +356,8 @@ mod tests { #[test] #[ignore] fn test_economy1() { + use std::sync::Arc; + execute_with_tracing(Level::INFO, || { let threadpool = rayon::ThreadPoolBuilder::new().build().unwrap(); info!("init"); @@ -366,12 +370,13 @@ mod tests { }; let mut index = crate::index::Index::new(seed); info!("Index created"); - let mut sim = sim::WorldSim::generate(seed, opts, &threadpool); + let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, Arc::new(|_| {})); info!("World loaded"); let mut names = None; let regenerate_input = false; if regenerate_input { - let _civs = crate::civ::Civs::generate(seed, &mut sim, &mut index); + let _civs = + crate::civ::Civs::generate(seed, &mut sim, &mut index, Arc::new(|_| {})); info!("Civs created"); let mut outarr: Vec = Vec::new(); for i in index.sites.values() { @@ -470,6 +475,8 @@ mod tests { #[test] /// test whether a site in moderate climate can survive on its own fn test_economy_moderate_standalone() { + use std::sync::Arc; + fn add_settlement( env: &mut Simenv, name: &str, @@ -505,7 +512,7 @@ mod tests { }; let index = crate::index::Index::new(seed); info!("Index created"); - let mut sim = sim::WorldSim::generate(seed, opts, &threadpool); + let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, Arc::new(|_| {})); info!("World loaded"); let rng = ChaChaRng::from_seed(seed_expan::rng_state(seed)); let mut env = Simenv { From 9ababec625ae402fcad0216e19c570383892ff7f Mon Sep 17 00:00:00 2001 From: Maxicarlos08 Date: Fri, 29 Sep 2023 23:28:29 +0200 Subject: [PATCH 3/5] fix UI issues & cleanup --- CHANGELOG.md | 1 + Cargo.lock | 1 - assets/voxygen/i18n/en/hud/misc.ftl | 18 +++++++++--------- client/Cargo.toml | 1 - client/src/bin/bot/main.rs | 1 + client/src/lib.rs | 21 +++++++-------------- server-cli/src/main.rs | 2 +- server/src/lib.rs | 22 ++++++++-------------- voxygen/src/menu/main/client_init.rs | 12 ++++++++---- voxygen/src/menu/main/mod.rs | 2 +- voxygen/src/menu/main/ui/connecting.rs | 4 ++-- voxygen/src/menu/main/ui/mod.rs | 1 + voxygen/src/singleplayer/mod.rs | 4 +++- world/src/civ/mod.rs | 1 + world/src/lib.rs | 1 + world/src/sim/mod.rs | 1 + 16 files changed, 45 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2f4374bed..9f8279eda9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Portals that spawn in place of the last staircase at old style dungeons to prevent stair cheesing - Mutliple singleplayer worlds and map generation UI. - New arena building in desert cities, suitable for PVP, also NPCs like to watch the fights too +- The loading screen now displays status updates for singleplayer server and client initialization progress ### Changed diff --git a/Cargo.lock b/Cargo.lock index 543bfe3b2f..46ea56fcca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6785,7 +6785,6 @@ dependencies = [ "authc", "byteorder", "clap", - "crossbeam-channel", "hashbrown 0.13.2", "image", "num 0.4.1", diff --git a/assets/voxygen/i18n/en/hud/misc.ftl b/assets/voxygen/i18n/en/hud/misc.ftl index 9dfc2a1254..4365dfc75f 100644 --- a/assets/voxygen/i18n/en/hud/misc.ftl +++ b/assets/voxygen/i18n/en/hud/misc.ftl @@ -61,18 +61,18 @@ hud-sit = Sit hud-steer = Steer hud-portal = Portal hud-init-stage-singleplayer = Starting singleplayer server... -hud-init-stage-server-db-migrations = [{ common-server }]: Applying database migrations -hud-init-stage-server-db-vacuum = [{ common-server }]: Cleaning up database +hud-init-stage-server-db-migrations = [{ common-server }]: Applying database migrations... +hud-init-stage-server-db-vacuum = [{ common-server }]: Cleaning up database... hud-init-stage-server-worldsim-erosion = [{ common-server }]: Erosion { $percentage }% hud-init-stage-server-worldciv-civcreate = [{ common-server }]: Generated { $generated } out of { $total } civilizations -hud-init-stage-server-worldciv-site = [{ common-server }]: Generating sites -hud-init-stage-server-economysim = [{ common-server }]: Simulating economy -hud-init-stage-server-spotgen = [{ common-server }]: Generating spots +hud-init-stage-server-worldciv-site = [{ common-server }]: Generating sites... +hud-init-stage-server-economysim = [{ common-server }]: Simulating economy... +hud-init-stage-server-spotgen = [{ common-server }]: Generating spots... hud-init-stage-server-starting = [{ common-server }]: Starting server... hud-init-stage-multiplayer = Starting multiplayer -hud-init-stage-client-connection-establish = [{ common-client }]: Establishing connection to server -hud-init-stage-client-request-server-version = [{ common-client }]: Wating for server version -hud-init-stage-client-authentication = [{ common-client }]: Authenticating -hud-init-stage-client-load-init-data = [{ common-client }]: Loading initialization data from server +hud-init-stage-client-connection-establish = [{ common-client }]: Establishing connection to server... +hud-init-stage-client-request-server-version = [{ common-client }]: Waiting for server version... +hud-init-stage-client-authentication = [{ common-client }]: Authenticating... +hud-init-stage-client-load-init-data = [{ common-client }]: Loading initialization data from server... hud-init-stage-client-starting-client = [{ common-client }]: Preparing Client... hud-init-stage-render-pipeline = Creating render pipeline ({ $done }/{ $total }) diff --git a/client/Cargo.toml b/client/Cargo.toml index 30c94e5e23..f459225045 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -30,7 +30,6 @@ tracing = { workspace = true } rayon = { workspace = true } specs = { workspace = true, features = ["serde", "storage-event-control", "derive"] } vek = { workspace = true } -crossbeam-channel = { workspace = true } hashbrown = { workspace = true } authc = { git = "https://gitlab.com/veloren/auth.git", rev = "abb1a705827984e11706d7bb97fb7a459e1e6533" } # xMAC94x/current_master_till_refactored branch diff --git a/client/src/bin/bot/main.rs b/client/src/bin/bot/main.rs index ca7298d81b..473aef4219 100644 --- a/client/src/bin/bot/main.rs +++ b/client/src/bin/bot/main.rs @@ -72,6 +72,7 @@ pub fn make_client( username, password, |_| true, + Arc::new(|_| {}) )) .ok() } diff --git a/client/src/lib.rs b/client/src/lib.rs index d5bfcbe50b..5ab3b6678e 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -66,7 +66,6 @@ use common_net::{ use common_state::State; use common_systems::add_local_systems; use comp::BuffKind; -use crossbeam_channel::Sender; use hashbrown::{HashMap, HashSet}; use image::DynamicImage; use network::{ConnectAddr, Network, Participant, Pid, Stream}; @@ -307,17 +306,11 @@ impl Client { username: &str, password: &str, auth_trusted: impl FnMut(&str) -> bool, - init_stage_update: Option>, + init_stage_update: Arc, ) -> Result { - let update_stage = |stage: ClientInitStage| { - if let Some(updater) = &init_stage_update { - let _ = updater.send(stage); - } - }; - let network = Network::new(Pid::new(), &runtime); - update_stage(ClientInitStage::ConnectionEstablish); + init_stage_update(ClientInitStage::ConnectionEstablish); let mut participant = match addr { ConnectionArgs::Tcp { hostname, @@ -347,7 +340,7 @@ impl Client { let in_game_stream = participant.opened().await?; let terrain_stream = participant.opened().await?; - update_stage(ClientInitStage::WatingForServerVersion); + init_stage_update(ClientInitStage::WatingForServerVersion); register_stream.send(ClientType::Game)?; let server_info: ServerInfo = register_stream.recv().await?; if server_info.git_hash != *common::util::GIT_HASH { @@ -366,7 +359,7 @@ impl Client { ping_stream.send(PingMsg::Ping)?; - update_stage(ClientInitStage::Authentication); + init_stage_update(ClientInitStage::Authentication); // Register client Self::register( username, @@ -377,7 +370,7 @@ impl Client { ) .await?; - update_stage(ClientInitStage::LoadingInitData); + init_stage_update(ClientInitStage::LoadingInitData); // Wait for initial sync let mut ping_interval = tokio::time::interval(Duration::from_secs(1)); let ServerInit::GameSync { @@ -401,7 +394,7 @@ impl Client { } }; - update_stage(ClientInitStage::StartingClient); + init_stage_update(ClientInitStage::StartingClient); // Spawn in a blocking thread (leaving the network thread free). This is mostly // useful for bots. let mut task = tokio::task::spawn_blocking(move || { @@ -3007,7 +3000,7 @@ mod tests { username, password, |suggestion: &str| suggestion == auth_server, - None, + Arc::new(|_| {}), )); let localisation = LocalizationHandle::load_expect("en"); diff --git a/server-cli/src/main.rs b/server-cli/src/main.rs index 1a26846b3e..aa2803d2e2 100644 --- a/server-cli/src/main.rs +++ b/server-cli/src/main.rs @@ -192,7 +192,7 @@ fn main() -> io::Result<()> { editable_settings, database_settings, &server_data_dir, - None, + Arc::new(|_| {}), runtime, ) .expect("Failed to create server instance!"); diff --git a/server/src/lib.rs b/server/src/lib.rs index a86271834b..8264bd3128 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -118,7 +118,6 @@ use crate::{ persistence::{DatabaseSettings, SqlLogMode}, sys::terrain, }; -use crossbeam_channel::Sender; use hashbrown::HashMap; use std::sync::RwLock; @@ -200,6 +199,7 @@ pub struct ChunkRequest { key: Vec2, } +#[derive(Debug)] pub enum ServerInitStage { DbMigrations, DbVacuum, @@ -230,7 +230,7 @@ impl Server { editable_settings: EditableSettings, database_settings: DatabaseSettings, data_dir: &std::path::Path, - stage_report_tx: Option>, + report_stage: Arc, runtime: Arc, ) -> Result { prof_span!("Server::new"); @@ -239,12 +239,6 @@ impl Server { info!("Authentication is disabled"); } - let report_stage = |stage: ServerInitStage| { - if let Some(stage_report_tx) = &stage_report_tx { - let _ = stage_report_tx.send(stage); - } - }; - report_stage(ServerInitStage::DbMigrations); // Run pending DB migrations (if any) debug!("Running DB migrations..."); @@ -271,7 +265,6 @@ impl Server { let pools = State::pools(GameMode::Server); - let world_generate_status_tx = stage_report_tx.clone(); #[cfg(feature = "worldgen")] let (world, index) = World::generate( settings.world_seed, @@ -286,11 +279,12 @@ impl Server { calendar: Some(settings.calendar_mode.calendar_now()), }, &pools, - Arc::new(move |stage| { - if let Some(stage_report_tx) = &world_generate_status_tx { - let _ = stage_report_tx.send(ServerInitStage::WorldGen(stage)); - } - }), + { + let report_stage = Arc::clone(&report_stage); + Arc::new(move |stage| { + report_stage(ServerInitStage::WorldGen(stage)); + }) + }, ); #[cfg(not(feature = "worldgen"))] let (world, index) = World::generate(settings.world_seed); diff --git a/voxygen/src/menu/main/client_init.rs b/voxygen/src/menu/main/client_init.rs index 55720bfcc8..1e73832a0a 100644 --- a/voxygen/src/menu/main/client_init.rs +++ b/voxygen/src/menu/main/client_init.rs @@ -52,7 +52,7 @@ impl ClientInit { ) -> Self { let (tx, rx) = unbounded(); let (trust_tx, trust_rx) = unbounded(); - let (init_stage_tx, init_stare_rx) = unbounded(); + let (init_stage_tx, init_stage_rx) = unbounded(); let cancel = Arc::new(AtomicBool::new(false)); let cancel2 = Arc::clone(&cancel); @@ -69,13 +69,17 @@ impl ClientInit { let mut last_err = None; + let client_stage_reporter: Arc = + Arc::new(move |stage| { + let _ = init_stage_tx.send(stage); + }); + const FOUR_MINUTES_RETRIES: u64 = 48; 'tries: for _ in 0..FOUR_MINUTES_RETRIES { if cancel2.load(Ordering::Relaxed) { break; } let mut mismatched_server_info = None; - let new_init_tx = init_stage_tx.clone(); match Client::new( connection_args.clone(), Arc::clone(&runtime2), @@ -83,7 +87,7 @@ impl ClientInit { &username, &password, trust_fn, - Some(new_init_tx), + Arc::clone(&client_stage_reporter), ) .await { @@ -120,7 +124,7 @@ impl ClientInit { ClientInit { rx, - stage_rx: init_stare_rx, + stage_rx: init_stage_rx, trust_tx, cancel, } diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index be1e9833a1..74ebb0a4e4 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -27,8 +27,8 @@ use tokio::runtime; use tracing::error; use ui::{Event as MainMenuEvent, MainMenuUi}; +#[derive(Debug)] pub enum DetailedInitializationStage { - // TODO: Map generation and server startup progress Singleplayer, SingleplayerServer(ServerInitStage), StartingMultiplayer, diff --git a/voxygen/src/menu/main/ui/connecting.rs b/voxygen/src/menu/main/ui/connecting.rs index 8db3fb3efd..b57500ee3e 100644 --- a/voxygen/src/menu/main/ui/connecting.rs +++ b/voxygen/src/menu/main/ui/connecting.rs @@ -206,11 +206,11 @@ impl Screen { ), }; - Container::new(Text::new(stage_message).size(fonts.cyri.scale(25))) + Container::new(Text::new(stage_message).size(fonts.cyri.scale(20))) .width(Length::Fill) .height(Length::Fill) .padding(10) - .align_y(Align::End) + .align_x(Align::Start) .into() }; diff --git a/voxygen/src/menu/main/ui/mod.rs b/voxygen/src/menu/main/ui/mod.rs index e2b65c8457..2668ad2c7e 100644 --- a/voxygen/src/menu/main/ui/mod.rs +++ b/voxygen/src/menu/main/ui/mod.rs @@ -728,6 +728,7 @@ impl MainMenuUi { pub fn show_info(&mut self, msg: String) { self.controls.connection_error(msg); } pub fn update_stage(&mut self, stage: DetailedInitializationStage) { + tracing::trace!(?stage, "Updating stage"); self.controls.init_stage(stage); } diff --git a/voxygen/src/singleplayer/mod.rs b/voxygen/src/singleplayer/mod.rs index 7d6fa7f84d..2682fe64a2 100644 --- a/voxygen/src/singleplayer/mod.rs +++ b/voxygen/src/singleplayer/mod.rs @@ -122,7 +122,9 @@ impl SingleplayerState { editable_settings, database_settings, &server_data_dir, - Some(server_stage_tx), + Arc::new(move |init_stage| { + let _ = server_stage_tx.send(init_stage); + }), runtime, ) { Ok(server) => (Some(server), Ok(())), diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index c02a04ac76..81fc1e4db4 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -224,6 +224,7 @@ impl<'a, R: Rng> GenCtx<'a, R> { } } +#[derive(Debug)] pub enum WorldCivStage { /// Civilization creation, how many out of how many civilizations have been /// generated yet diff --git a/world/src/lib.rs b/world/src/lib.rs index f0fd5f266d..74c86e7145 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -87,6 +87,7 @@ pub enum Error { Other(String), } +#[derive(Debug)] pub enum WorldGenerateStage { WorldSimGenerate(WorldSimStage), WorldCivGenerate(WorldCivStage), diff --git a/world/src/sim/mod.rs b/world/src/sim/mod.rs index 460da29b8b..cf9e0ff93c 100644 --- a/world/src/sim/mod.rs +++ b/world/src/sim/mod.rs @@ -646,6 +646,7 @@ impl WorldFile { } } +#[derive(Debug)] pub enum WorldSimStage { // TODO: Add more stages Erosion(f64), From 7734b653e735d5a1a2d49079601699ee985cf6b2 Mon Sep 17 00:00:00 2001 From: Maxicarlos08 Date: Mon, 2 Oct 2023 16:51:03 +0200 Subject: [PATCH 4/5] replace all uses of Arc<> with references --- client/src/bin/bot/main.rs | 2 +- client/src/lib.rs | 4 ++-- server-cli/src/main.rs | 2 +- server/src/lib.rs | 9 +++---- voxygen/benches/meshing_benchmark.rs | 2 +- voxygen/src/menu/main/client_init.rs | 9 +++---- voxygen/src/singleplayer/mod.rs | 4 ++-- .../examples/chunk_compression_benchmarks.rs | 1 + world/examples/dungeon_voxel_export.rs | 3 +-- world/examples/heightmap_visualization.rs | 1 + world/examples/pricing_csv.rs | 4 ++-- world/examples/view.rs | 7 ++---- world/examples/water.rs | 4 ++-- world/examples/world_block_statistics.rs | 1 + world/examples/world_generate_time.rs | 4 ++-- world/src/civ/mod.rs | 3 +-- world/src/lib.rs | 24 +++++++------------ world/src/sim/erosion.rs | 3 +-- world/src/sim/mod.rs | 13 +++++----- world/src/site/economy/context.rs | 17 ++++--------- 20 files changed, 46 insertions(+), 71 deletions(-) diff --git a/client/src/bin/bot/main.rs b/client/src/bin/bot/main.rs index 473aef4219..4ac6449d46 100644 --- a/client/src/bin/bot/main.rs +++ b/client/src/bin/bot/main.rs @@ -72,7 +72,7 @@ pub fn make_client( username, password, |_| true, - Arc::new(|_| {}) + &|_| {}, )) .ok() } diff --git a/client/src/lib.rs b/client/src/lib.rs index 5ab3b6678e..0d952e441d 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -306,7 +306,7 @@ impl Client { username: &str, password: &str, auth_trusted: impl FnMut(&str) -> bool, - init_stage_update: Arc, + init_stage_update: &(dyn Fn(ClientInitStage) + Send + Sync), ) -> Result { let network = Network::new(Pid::new(), &runtime); @@ -3000,7 +3000,7 @@ mod tests { username, password, |suggestion: &str| suggestion == auth_server, - Arc::new(|_| {}), + &|_| {}, )); let localisation = LocalizationHandle::load_expect("en"); diff --git a/server-cli/src/main.rs b/server-cli/src/main.rs index aa2803d2e2..c269adbb77 100644 --- a/server-cli/src/main.rs +++ b/server-cli/src/main.rs @@ -192,7 +192,7 @@ fn main() -> io::Result<()> { editable_settings, database_settings, &server_data_dir, - Arc::new(|_| {}), + &|_| {}, runtime, ) .expect("Failed to create server instance!"); diff --git a/server/src/lib.rs b/server/src/lib.rs index 8264bd3128..408c6c1362 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -230,7 +230,7 @@ impl Server { editable_settings: EditableSettings, database_settings: DatabaseSettings, data_dir: &std::path::Path, - report_stage: Arc, + report_stage: &(dyn Fn(ServerInitStage) + Send + Sync), runtime: Arc, ) -> Result { prof_span!("Server::new"); @@ -279,11 +279,8 @@ impl Server { calendar: Some(settings.calendar_mode.calendar_now()), }, &pools, - { - let report_stage = Arc::clone(&report_stage); - Arc::new(move |stage| { - report_stage(ServerInitStage::WorldGen(stage)); - }) + &|stage| { + report_stage(ServerInitStage::WorldGen(stage)); }, ); #[cfg(not(feature = "worldgen"))] diff --git a/voxygen/benches/meshing_benchmark.rs b/voxygen/benches/meshing_benchmark.rs index cdcc8c442e..4b78cb5db5 100644 --- a/voxygen/benches/meshing_benchmark.rs +++ b/voxygen/benches/meshing_benchmark.rs @@ -25,7 +25,7 @@ pub fn criterion_benchmark(c: &mut Criterion) { calendar: None, }, &pool, - Arc::new(|_| {}), + &|_| {}, ); let mut terrain = TerrainGrid::new( world.sim().map_size_lg(), diff --git a/voxygen/src/menu/main/client_init.rs b/voxygen/src/menu/main/client_init.rs index 1e73832a0a..a07c67920a 100644 --- a/voxygen/src/menu/main/client_init.rs +++ b/voxygen/src/menu/main/client_init.rs @@ -69,11 +69,6 @@ impl ClientInit { let mut last_err = None; - let client_stage_reporter: Arc = - Arc::new(move |stage| { - let _ = init_stage_tx.send(stage); - }); - const FOUR_MINUTES_RETRIES: u64 = 48; 'tries: for _ in 0..FOUR_MINUTES_RETRIES { if cancel2.load(Ordering::Relaxed) { @@ -87,7 +82,9 @@ impl ClientInit { &username, &password, trust_fn, - Arc::clone(&client_stage_reporter), + &|stage| { + let _ = init_stage_tx.send(stage); + }, ) .await { diff --git a/voxygen/src/singleplayer/mod.rs b/voxygen/src/singleplayer/mod.rs index 2682fe64a2..6920188078 100644 --- a/voxygen/src/singleplayer/mod.rs +++ b/voxygen/src/singleplayer/mod.rs @@ -122,9 +122,9 @@ impl SingleplayerState { editable_settings, database_settings, &server_data_dir, - Arc::new(move |init_stage| { + &|init_stage| { let _ = server_stage_tx.send(init_stage); - }), + }, runtime, ) { Ok(server) => (Some(server), Ok(())), diff --git a/world/examples/chunk_compression_benchmarks.rs b/world/examples/chunk_compression_benchmarks.rs index 46727195b9..d8fc915a87 100644 --- a/world/examples/chunk_compression_benchmarks.rs +++ b/world/examples/chunk_compression_benchmarks.rs @@ -680,6 +680,7 @@ fn main() { calendar: None, }, &pool, + &|_| {}, ); println!("Loaded world"); const HISTOGRAMS: bool = false; diff --git a/world/examples/dungeon_voxel_export.rs b/world/examples/dungeon_voxel_export.rs index d96570a176..f0280c8e1f 100644 --- a/world/examples/dungeon_voxel_export.rs +++ b/world/examples/dungeon_voxel_export.rs @@ -2,7 +2,6 @@ use std::{ collections::HashMap, fs::File, io::{prelude::*, SeekFrom}, - sync::Arc, }; type Result = std::io::Result<()>; @@ -33,7 +32,7 @@ fn main() -> Result { calendar: None, }, &pool, - Arc::new(|_| {}), + &|_| {}, ); println!("Loaded world"); let export_path = "dungeon.vox"; diff --git a/world/examples/heightmap_visualization.rs b/world/examples/heightmap_visualization.rs index f457bc7d0f..22e42b4e01 100644 --- a/world/examples/heightmap_visualization.rs +++ b/world/examples/heightmap_visualization.rs @@ -127,6 +127,7 @@ fn main() { calendar: None, }, &pool, + &|_| {}, ); println!("Loaded world"); diff --git a/world/examples/pricing_csv.rs b/world/examples/pricing_csv.rs index 54e12cf174..26dd357d0f 100644 --- a/world/examples/pricing_csv.rs +++ b/world/examples/pricing_csv.rs @@ -4,7 +4,7 @@ use common::{ }; use rayon::ThreadPoolBuilder; use rusqlite::{Connection, ToSql}; -use std::{error::Error, sync::Arc}; +use std::error::Error; use strum::IntoEnumIterator; use vek::Vec2; use veloren_world::{ @@ -169,7 +169,7 @@ fn main() { calendar: None, }, &pool, - Arc::new(|_| {}), + &|_| {}, ); println!("Loaded world"); diff --git a/world/examples/view.rs b/world/examples/view.rs index b4bda62152..927a93618c 100644 --- a/world/examples/view.rs +++ b/world/examples/view.rs @@ -1,7 +1,4 @@ -use std::{ - ops::{Add, Mul, Sub}, - sync::Arc, -}; +use std::ops::{Add, Mul, Sub}; use vek::*; use veloren_world::{sim::WorldOpts, util::Sampler, World}; @@ -17,7 +14,7 @@ fn main() { ..WorldOpts::default() }, &threadpool, - Arc::new(|_| {}), + &|_| {}, ); let index = index.as_index_ref(); diff --git a/world/examples/water.rs b/world/examples/water.rs index cf020c07e0..4b2475713a 100644 --- a/world/examples/water.rs +++ b/world/examples/water.rs @@ -7,7 +7,7 @@ use common::{ vol::RectVolSize, }; use rayon::prelude::*; -use std::{f64, io::Write, path::PathBuf, sync::Arc, time::SystemTime}; +use std::{f64, io::Write, path::PathBuf, time::SystemTime}; use tracing::{warn, Level}; use tracing_subscriber::{ filter::{EnvFilter, LevelFilter}, @@ -53,7 +53,7 @@ fn main() { calendar: None, }, &threadpool, - Arc::new(|_| {}), + &|_| {}, ); let index = index.as_index_ref(); tracing::info!("Sampling data..."); diff --git a/world/examples/world_block_statistics.rs b/world/examples/world_block_statistics.rs index a0bf81309f..cce21a0259 100644 --- a/world/examples/world_block_statistics.rs +++ b/world/examples/world_block_statistics.rs @@ -70,6 +70,7 @@ fn generate(db_path: &str, ymin: Option, ymax: Option) -> Result<(), B calendar: None, }, &pool, + &|_| {}, ); println!("Loaded world"); diff --git a/world/examples/world_generate_time.rs b/world/examples/world_generate_time.rs index 012e5cbd73..7292a2cf32 100644 --- a/world/examples/world_generate_time.rs +++ b/world/examples/world_generate_time.rs @@ -1,4 +1,4 @@ -use std::{sync::Arc, time::Instant}; +use std::time::Instant; use veloren_world::{ sim::{FileOpts, WorldOpts, DEFAULT_WORLD_MAP}, World, @@ -17,7 +17,7 @@ fn main() { calendar: None, }, &threadpool, - Arc::new(|_| {}), + &|_| {}, ); core::hint::black_box((world, index)); println!("{} ms", start.elapsed().as_nanos() / 1_000_000); diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index 81fc1e4db4..17009fd9ab 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -27,7 +27,6 @@ use core::{fmt, hash::BuildHasherDefault, ops::Range}; use fxhash::FxHasher64; use rand::prelude::*; use rand_chacha::ChaChaRng; -use std::sync::Arc; use tracing::{debug, info, warn}; use vek::*; @@ -237,7 +236,7 @@ impl Civs { seed: u32, sim: &mut WorldSim, index: &mut Index, - report_stage: Arc, + report_stage: &dyn Fn(WorldCivStage), ) -> Self { prof_span!("Civs::generate"); let mut this = Self::default(); diff --git a/world/src/lib.rs b/world/src/lib.rs index 74c86e7145..ce8737d36a 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -64,7 +64,7 @@ use enum_map::EnumMap; use rand::{prelude::*, Rng}; use rand_chacha::ChaCha8Rng; use serde::Deserialize; -use std::{sync::Arc, time::Duration}; +use std::time::Duration; use vek::*; #[cfg(all(feature = "be-dyn-lib", feature = "use-dyn-lib"))] @@ -120,7 +120,7 @@ impl World { seed: u32, opts: sim::WorldOpts, threadpool: &rayon::ThreadPool, - report_stage: Arc, + report_stage: &(dyn Fn(WorldGenerateStage) + Send + Sync), ) -> (Self, IndexOwned) { prof_span!("World::generate"); // NOTE: Generating index first in order to quickly fail if the color manifest @@ -128,21 +128,13 @@ impl World { threadpool.install(|| { let mut index = Index::new(seed); - let sim_stage_tx = Arc::clone(&report_stage); - let mut sim = sim::WorldSim::generate( - seed, - opts, - threadpool, - Arc::new(move |stage| sim_stage_tx(WorldGenerateStage::WorldSimGenerate(stage))), - ); + let mut sim = sim::WorldSim::generate(seed, opts, threadpool, &|stage| { + report_stage(WorldGenerateStage::WorldSimGenerate(stage)) + }); - let civ_stage_tx = Arc::clone(&report_stage); - let civs = civ::Civs::generate( - seed, - &mut sim, - &mut index, - Arc::new(move |stage| civ_stage_tx(WorldGenerateStage::WorldCivGenerate(stage))), - ); + let civs = civ::Civs::generate(seed, &mut sim, &mut index, &|stage| { + report_stage(WorldGenerateStage::WorldCivGenerate(stage)) + }); report_stage(WorldGenerateStage::EconomySimulation); sim2::simulate(&mut index, &mut sim); diff --git a/world/src/sim/erosion.rs b/world/src/sim/erosion.rs index b6f987f088..0309d5c8dd 100644 --- a/world/src/sim/erosion.rs +++ b/world/src/sim/erosion.rs @@ -19,7 +19,6 @@ use std::{ cmp::{Ordering, Reverse}, collections::BinaryHeap, f32, fmt, mem, - rc::Rc, time::Instant, u32, }; @@ -2541,7 +2540,7 @@ pub fn do_erosion( k_d_scale: f64, k_da_scale: impl Fn(f64) -> f64, threadpool: &rayon::ThreadPool, - report_progress: Rc, + report_progress: &dyn Fn(f64), ) -> (Box<[Alt]>, Box<[Alt]> /* , Box<[Alt]> */) { debug!("Initializing erosion arrays..."); let oldh_ = (0..map_size_lg.chunks_len()) diff --git a/world/src/sim/mod.rs b/world/src/sim/mod.rs index cf9e0ff93c..b3729c4165 100644 --- a/world/src/sim/mod.rs +++ b/world/src/sim/mod.rs @@ -69,7 +69,6 @@ use std::{ io::{BufReader, BufWriter}, ops::{Add, Div, Mul, Neg, Sub}, path::PathBuf, - rc::Rc, sync::Arc, }; use strum::IntoEnumIterator; @@ -674,7 +673,7 @@ impl WorldSim { seed: u32, opts: WorldOpts, threadpool: &rayon::ThreadPool, - stage_report: Arc, + stage_report: &dyn Fn(WorldSimStage), ) -> Self { prof_span!("WorldSim::generate"); let calendar = opts.calendar; // separate lifetime of elements @@ -1262,8 +1261,8 @@ impl WorldSim { // Perform some erosion. - let report_erosion: Rc = - Rc::new(move |progress: f64| stage_report(WorldSimStage::Erosion(progress))); + let report_erosion: &dyn Fn(f64) = + &move |progress: f64| stage_report(WorldSimStage::Erosion(progress)); let (alt, basement) = if let Some(map) = parsed_world_file { (map.alt, map.basement) @@ -1293,7 +1292,7 @@ impl WorldSim { k_d_scale(n_approx), k_da_scale, threadpool, - Rc::clone(&report_erosion), + report_erosion, ); // Quick "small scale" erosion cycle in order to lower extreme angles. @@ -1318,7 +1317,7 @@ impl WorldSim { k_d_scale(n_approx), k_da_scale, threadpool, - Rc::clone(&report_erosion), + &report_erosion, ) }; @@ -1368,7 +1367,7 @@ impl WorldSim { k_d_scale(n_approx), k_da_scale, threadpool, - Rc::clone(&report_erosion), + &report_erosion, ) }; diff --git a/world/src/site/economy/context.rs b/world/src/site/economy/context.rs index dfcdd70fff..2ea989759f 100644 --- a/world/src/site/economy/context.rs +++ b/world/src/site/economy/context.rs @@ -328,8 +328,6 @@ mod tests { #[test] #[ignore] fn test_economy0() { - use std::sync::Arc; - execute_with_tracing(Level::INFO, || { let threadpool = rayon::ThreadPoolBuilder::new().build().unwrap(); info!("init"); @@ -342,9 +340,9 @@ mod tests { }; let mut index = crate::index::Index::new(seed); info!("Index created"); - let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, Arc::new(|_| {})); + let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, &|_| {}); info!("World loaded"); - let _civs = crate::civ::Civs::generate(seed, &mut sim, &mut index, Arc::new(|_| {})); + let _civs = crate::civ::Civs::generate(seed, &mut sim, &mut index, &|_| {}); info!("Civs created"); crate::sim2::simulate(&mut index, &mut sim); show_economy(&index.sites, &None); @@ -356,8 +354,6 @@ mod tests { #[test] #[ignore] fn test_economy1() { - use std::sync::Arc; - execute_with_tracing(Level::INFO, || { let threadpool = rayon::ThreadPoolBuilder::new().build().unwrap(); info!("init"); @@ -370,13 +366,12 @@ mod tests { }; let mut index = crate::index::Index::new(seed); info!("Index created"); - let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, Arc::new(|_| {})); + let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, &|_| {}); info!("World loaded"); let mut names = None; let regenerate_input = false; if regenerate_input { - let _civs = - crate::civ::Civs::generate(seed, &mut sim, &mut index, Arc::new(|_| {})); + let _civs = crate::civ::Civs::generate(seed, &mut sim, &mut index, &|_| {}); info!("Civs created"); let mut outarr: Vec = Vec::new(); for i in index.sites.values() { @@ -475,8 +470,6 @@ mod tests { #[test] /// test whether a site in moderate climate can survive on its own fn test_economy_moderate_standalone() { - use std::sync::Arc; - fn add_settlement( env: &mut Simenv, name: &str, @@ -512,7 +505,7 @@ mod tests { }; let index = crate::index::Index::new(seed); info!("Index created"); - let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, Arc::new(|_| {})); + let mut sim = sim::WorldSim::generate(seed, opts, &threadpool, &|_| {}); info!("World loaded"); let rng = ChaChaRng::from_seed(seed_expan::rng_state(seed)); let mut env = Simenv { From a3be68930e42efb4b359bd0fe6630d03fa8d2636 Mon Sep 17 00:00:00 2001 From: Maxicarlos08 Date: Mon, 2 Oct 2023 22:39:30 +0200 Subject: [PATCH 5/5] review comments --- assets/voxygen/i18n/en/common.ftl | 2 -- assets/voxygen/i18n/en/hud/misc.ftl | 29 ++++++++++++++++------------- client/examples/chat-cli/main.rs | 1 + voxygen/src/menu/main/mod.rs | 2 -- voxygen/src/menu/main/ui/mod.rs | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/assets/voxygen/i18n/en/common.ftl b/assets/voxygen/i18n/en/common.ftl index 6d304bfdbc..0b69c4d703 100644 --- a/assets/voxygen/i18n/en/common.ftl +++ b/assets/voxygen/i18n/en/common.ftl @@ -2,8 +2,6 @@ common-username = username common-singleplayer = Singleplayer common-multiplayer = Multiplayer common-servers = Servers -common-server = Server -common-client = Client common-quit = Quit common-settings = Settings common-languages = Languages diff --git a/assets/voxygen/i18n/en/hud/misc.ftl b/assets/voxygen/i18n/en/hud/misc.ftl index 4365dfc75f..7f5b51943e 100644 --- a/assets/voxygen/i18n/en/hud/misc.ftl +++ b/assets/voxygen/i18n/en/hud/misc.ftl @@ -60,19 +60,22 @@ hud-stay= Stay hud-sit = Sit hud-steer = Steer hud-portal = Portal + +-server = Server +-client = Client hud-init-stage-singleplayer = Starting singleplayer server... -hud-init-stage-server-db-migrations = [{ common-server }]: Applying database migrations... -hud-init-stage-server-db-vacuum = [{ common-server }]: Cleaning up database... -hud-init-stage-server-worldsim-erosion = [{ common-server }]: Erosion { $percentage }% -hud-init-stage-server-worldciv-civcreate = [{ common-server }]: Generated { $generated } out of { $total } civilizations -hud-init-stage-server-worldciv-site = [{ common-server }]: Generating sites... -hud-init-stage-server-economysim = [{ common-server }]: Simulating economy... -hud-init-stage-server-spotgen = [{ common-server }]: Generating spots... -hud-init-stage-server-starting = [{ common-server }]: Starting server... +hud-init-stage-server-db-migrations = [{ -server }]: Applying database migrations... +hud-init-stage-server-db-vacuum = [{ -server }]: Cleaning up database... +hud-init-stage-server-worldsim-erosion = [{ -server }]: Erosion { $percentage }% +hud-init-stage-server-worldciv-civcreate = [{ -server }]: Generated { $generated } out of { $total } civilizations +hud-init-stage-server-worldciv-site = [{ -server }]: Generating sites... +hud-init-stage-server-economysim = [{ -server }]: Simulating economy... +hud-init-stage-server-spotgen = [{ -server }]: Generating spots... +hud-init-stage-server-starting = [{ -server }]: Starting server... hud-init-stage-multiplayer = Starting multiplayer -hud-init-stage-client-connection-establish = [{ common-client }]: Establishing connection to server... -hud-init-stage-client-request-server-version = [{ common-client }]: Waiting for server version... -hud-init-stage-client-authentication = [{ common-client }]: Authenticating... -hud-init-stage-client-load-init-data = [{ common-client }]: Loading initialization data from server... -hud-init-stage-client-starting-client = [{ common-client }]: Preparing Client... +hud-init-stage-client-connection-establish = [{ -client }]: Establishing connection to server... +hud-init-stage-client-request-server-version = [{ -client }]: Waiting for server version... +hud-init-stage-client-authentication = [{ -client }]: Authenticating... +hud-init-stage-client-load-init-data = [{ -client }]: Loading initialization data from server... +hud-init-stage-client-starting-client = [{ -client }]: Preparing Client... hud-init-stage-render-pipeline = Creating render pipeline ({ $done }/{ $total }) diff --git a/client/examples/chat-cli/main.rs b/client/examples/chat-cli/main.rs index 40d7d3614e..fb766195d3 100644 --- a/client/examples/chat-cli/main.rs +++ b/client/examples/chat-cli/main.rs @@ -64,6 +64,7 @@ fn main() { &username, &password, |provider| provider == "https://auth.veloren.net", + &|_| {}, )) .expect("Failed to create client instance"); diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs index 74ebb0a4e4..25ddce1c9e 100644 --- a/voxygen/src/menu/main/mod.rs +++ b/voxygen/src/menu/main/mod.rs @@ -36,8 +36,6 @@ pub enum DetailedInitializationStage { CreatingRenderPipeline(usize, usize), } -// TODO: show status messages for waiting on server creation, client init, and -// pipeline creation (we can show progress of pipeline creation) enum InitState { None, // Waiting on the client initialization diff --git a/voxygen/src/menu/main/ui/mod.rs b/voxygen/src/menu/main/ui/mod.rs index 2668ad2c7e..cf83b03dd3 100644 --- a/voxygen/src/menu/main/ui/mod.rs +++ b/voxygen/src/menu/main/ui/mod.rs @@ -636,7 +636,7 @@ impl Controls { } } - fn init_stage(&mut self, stage: DetailedInitializationStage) { + fn update_init_stage(&mut self, stage: DetailedInitializationStage) { if let Screen::Connecting { init_stage, .. } = &mut self.screen { *init_stage = stage } @@ -729,7 +729,7 @@ impl MainMenuUi { pub fn update_stage(&mut self, stage: DetailedInitializationStage) { tracing::trace!(?stage, "Updating stage"); - self.controls.init_stage(stage); + self.controls.update_init_stage(stage); } pub fn connected(&mut self) { self.controls.exit_connect_screen(); }