From ffbab6cb5f0e616b9d3158377d63041cb1b4602f Mon Sep 17 00:00:00 2001 From: LynithDev <61880709+LynithDev@users.noreply.github.com> Date: Mon, 1 Apr 2024 17:12:58 +0200 Subject: [PATCH] fix: Changed way of downloading and using assets in pre 1.6 versions --- onelauncher/src/game/client.rs | 1 + onelauncher/src/game/clients/vanilla.rs | 44 +++++++++++++++++-------- onelauncher/src/game/minecraft.rs | 12 +++++-- src/ui/pages/Home.tsx | 4 +-- 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/onelauncher/src/game/client.rs b/onelauncher/src/game/client.rs index d8cc47da..b34aff99 100644 --- a/onelauncher/src/game/client.rs +++ b/onelauncher/src/game/client.rs @@ -69,6 +69,7 @@ pub trait ClientTrait<'a>: Send + Sync { let manifest = &self.get_manifest().minecraft_manifest; let args = get_arguments(manifest)? + .replace("${game_assets}", "${assets_root}") .replace("${auth_player_name}", &info.account.username) .replace("${version_name}", &info.setup.version) .replace("${game_directory}", info.setup.game_dir.to_str().unwrap()) diff --git a/onelauncher/src/game/clients/vanilla.rs b/onelauncher/src/game/clients/vanilla.rs index 4d206488..8e16133f 100644 --- a/onelauncher/src/game/clients/vanilla.rs +++ b/onelauncher/src/game/clients/vanilla.rs @@ -30,26 +30,31 @@ impl<'a> ClientTrait<'a> for VanillaClient<'a> { async fn setup(&self) -> crate::Result { let manifest = &self.manifest.minecraft_manifest; + // Create game directory + let game_dir = self.cluster.dir()?.join("game"); + fs::create_dir_all(&game_dir)?; + // Install everything let client_path = install_game(manifest).await?; let mut libraries = install_libraries(manifest).await?; - let assets = install_assets(manifest).await?; + + // Resources dir used for legacy versions + // with map_to_resources set to true in their asset indexes + let resources_dir = game_dir.join("resources"); + let (asset_index, assets_dir) = install_assets(manifest, &resources_dir).await?; // Append client path to the libraries string at the end libraries.push_str(constants::LIBRARY_SPLITTER); libraries.push_str(client_path.to_str().unwrap()); - // Create game directory - let game_dir = self.cluster.dir()?.join("game"); - fs::create_dir_all(&game_dir)?; Ok(SetupInfo { version: manifest.version.clone(), libraries, natives_dir: dirs::natives_dir()?, game_dir, - assets_dir: dirs::assets_dir()?, - asset_index: assets, + assets_dir, + asset_index, }) } } @@ -130,7 +135,7 @@ pub async fn install_natives(natives: Vec<&Library>) -> crate::Result<()> { Ok(()) } -pub async fn install_assets(manifest: &MinecraftManifest) -> crate::Result { +pub async fn install_assets(manifest: &MinecraftManifest, resources_dir: &PathBuf) -> crate::Result<(String, PathBuf)> { let assets = dirs::assets_dir()?; let objects = assets.join("objects"); let indexes = assets.join("indexes"); @@ -145,10 +150,16 @@ pub async fn install_assets(manifest: &MinecraftManifest) -> crate::Result(&fs::read_to_string(&index)?)?; - for (_, asset) in contents.objects { + for (path, asset) in contents.objects { let hash = asset.hash.clone(); let short = &hash[..2]; - let file = objects.join(&short).join(&hash); + + let file = if contents.map_to_resources { + resources_dir.join(path) + } else { + objects.join(&short).join(&hash) + }; + fs::create_dir_all(file.parent().ok_or(anyhow!("Couldn't get asset parent"))?)?; if !file.exists() { @@ -157,7 +168,10 @@ pub async fn install_assets(manifest: &MinecraftManifest) -> crate::Result crate::Result() - .await?; - Ok(manifest) + .json::().await; + + if let Err(err) = manifest { + println!("{:#?}", err); + return Err(err.into()); + } + Ok(manifest.unwrap()) } diff --git a/onelauncher/src/game/minecraft.rs b/onelauncher/src/game/minecraft.rs index b08a9357..434b34d6 100644 --- a/onelauncher/src/game/minecraft.rs +++ b/onelauncher/src/game/minecraft.rs @@ -23,12 +23,14 @@ pub struct MinecraftManifest { pub downloads: Downloads, pub java_version: JavaVersion, pub libraries: Vec, - pub logging: Logging, pub main_class: String, pub release_time: String, - + #[serde(rename = "id")] pub version: String, + + #[serde(skip_serializing_if = "Option::is_none")] + pub logging: Option, #[serde(rename = "type")] pub release_type: ReleaseType, @@ -91,7 +93,7 @@ pub struct ModernArgumentRuleItem { } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] +#[serde(rename_all = "snake_case")] pub enum ReleaseType { Snapshot, Release, @@ -268,9 +270,13 @@ pub struct File { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct AssetIndexFile { + #[serde(default = "default_false")] + pub map_to_resources: bool, pub objects: HashMap, } +fn default_false() -> bool { false } + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct AssetObject { pub hash: String, diff --git a/src/ui/pages/Home.tsx b/src/ui/pages/Home.tsx index 07836348..19cb1162 100644 --- a/src/ui/pages/Home.tsx +++ b/src/ui/pages/Home.tsx @@ -196,8 +196,8 @@ function HomePage() { async function newInstance() { await createCluster({ - name: 'Modern cluster', - version: '1.8.9', + name: '1.0 cluster', + version: 'a1.0.11', client: { type: 'Vanilla', },