From 7ab13ee5da165b2c235e1bfd591aebbc4d9c03f4 Mon Sep 17 00:00:00 2001 From: melihonat Date: Sun, 12 Jul 2026 21:39:39 -0400 Subject: [PATCH] Add custom world name option (#1122) --- src/args.rs | 5 ++ src/gui.rs | 31 ++++---- src/gui/index.html | 11 +++ src/gui/js/main.js | 26 ++++++- src/gui/locales/ar.json | 1 + src/gui/locales/de.json | 1 + src/gui/locales/en-US.json | 1 + src/gui/locales/es.json | 1 + src/gui/locales/fi.json | 1 + src/gui/locales/fr-FR.json | 1 + src/gui/locales/hu.json | 1 + src/gui/locales/ja.json | 1 + src/gui/locales/ko.json | 1 + src/gui/locales/lt.json | 1 + src/gui/locales/lv.json | 1 + src/gui/locales/pl.json | 1 + src/gui/locales/pt-BR.json | 1 + src/gui/locales/ru.json | 1 + src/gui/locales/sl.json | 1 + src/gui/locales/sv.json | 1 + src/gui/locales/ua.json | 1 + src/gui/locales/zh-CN.json | 1 + src/main.rs | 15 ++-- src/map_item.rs | 20 +++-- src/world_utils.rs | 148 +++++++++++++++++++++++++++++-------- 25 files changed, 208 insertions(+), 66 deletions(-) diff --git a/src/args.rs b/src/args.rs index 049d0bf0b..4ce17c12e 100644 --- a/src/args.rs +++ b/src/args.rs @@ -24,6 +24,11 @@ pub struct Args { #[arg(long = "output-dir", alias = "path")] pub path: Option, + /// Custom name for the generated world (optional, default: auto-generated). + /// A counter suffix is appended if a world with that name already exists. + #[arg(long)] + pub world_name: Option, + /// Generate a Bedrock Edition world (.mcworld) instead of Java Edition #[arg(long)] pub bedrock: bool, diff --git a/src/gui.rs b/src/gui.rs index 19ff187ad..8a3861bb6 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -279,7 +279,7 @@ fn gui_pick_save_directory(start_path: String) -> Result { /// Creates a new Java Edition world in the given base save directory. /// Called when the user clicks "Create World". #[tauri::command] -fn gui_create_world(save_path: String) -> Result { +fn gui_create_world(save_path: String, world_name: Option) -> Result { let trimmed = save_path.trim(); if trimmed.is_empty() { return Err(3); @@ -288,11 +288,11 @@ fn gui_create_world(save_path: String) -> Result { if !base.is_dir() { return Err(3); // Error code 3: Failed to create new world } - create_new_world(&base).map_err(|_| 3) + create_new_world(&base, world_name.as_deref()).map_err(|_| 3) } -fn create_new_world(base_path: &Path) -> Result { - crate::world_utils::create_new_world(base_path) +fn create_new_world(base_path: &Path, custom_name: Option<&str>) -> Result { + crate::world_utils::create_new_world(base_path, custom_name) } /// Adds localized area name to the world name in level.dat @@ -932,6 +932,7 @@ fn gui_start_generation( gamemode: String, world_time: i64, map_item: bool, + world_name: Option, ) -> Result<(), String> { use progress::emit_gui_error; use LLBBox; @@ -1107,24 +1108,21 @@ fn gui_start_generation( (updated_path, None) } WorldFormat::BedrockMcWorld => { - // Bedrock: generate .mcworld on Desktop with location-based name + // Bedrock: generate .mcworld on Desktop with custom or location-based name let output_dir = crate::world_utils::get_bedrock_output_directory(); - let (output_path, lvl_name) = - crate::world_utils::build_bedrock_output(&bbox, output_dir); + let (output_path, lvl_name) = crate::world_utils::build_bedrock_output( + &bbox, + output_dir, + world_name.as_deref(), + ); progress::emit_world_name_update(&lvl_name); (output_path, Some(lvl_name)) } WorldFormat::LuantiWorld => { let worlds_dir = crate::world_utils::get_luanti_worlds_directory(); let _ = std::fs::create_dir_all(&worlds_dir); - let mut counter = 1; - let world_name = loop { - let candidate = format!("Arnis Luanti World {counter}"); - if !worlds_dir.join(&candidate).exists() { - break candidate; - } - counter += 1; - }; + let world_name = + crate::world_utils::luanti_world_name(&worlds_dir, world_name.as_deref()); let luanti_path = worlds_dir.join(&world_name); println!( "Creating Luanti world at: {}", @@ -1180,6 +1178,9 @@ fn gui_start_generation( } else { world_path }), + // World naming is already resolved above (create_new_world / + // build_bedrock_output / luanti_world_name), so Args doesn't need it. + world_name: None, bedrock: world_format == WorldFormat::BedrockMcWorld, luanti: world_format == WorldFormat::LuantiWorld, downloader: "requests".to_string(), diff --git a/src/gui/index.html b/src/gui/index.html index 6ccd4491c..5f1a00bde 100644 --- a/src/gui/index.html +++ b/src/gui/index.html @@ -166,6 +166,17 @@

Settings

World
+ +
+ +
+ +
+
+