diff --git a/packages/core/examples/download_minecraft.rs b/packages/core/examples/download_minecraft.rs index f703b42a..88e463ee 100644 --- a/packages/core/examples/download_minecraft.rs +++ b/packages/core/examples/download_minecraft.rs @@ -1,5 +1,9 @@ use anyhow::anyhow; -use onelauncher_core::{api::{game::metadata::{download_minecraft_ingressed, download_version_info}, proxy::ProxyDynamic}, error::LauncherResult, initialize_core, store::{CoreOptions, State}}; +use onelauncher_core::api::game::metadata::{download_minecraft_ingressed, download_version_info}; +use onelauncher_core::api::proxy::ProxyDynamic; +use onelauncher_core::error::LauncherResult; +use onelauncher_core::initialize_core; +use onelauncher_core::store::{CoreOptions, State}; #[tokio::main] async fn main() -> LauncherResult<()> { @@ -9,10 +13,16 @@ async fn main() -> LauncherResult<()> { let mut metadata = state.metadata.write().await; let versions = metadata.get_vanilla_or_fetch().await?; - let version = versions.versions.iter().find(|v| v.id == "1.20.4").ok_or_else(|| anyhow!("couldn't find 1.8.9 in version list"))?; + let version = versions + .versions + .iter() + .find(|v| v.id == "1.20.4") + .ok_or_else(|| anyhow!("couldn't find 1.20.4 in version list"))?; let version_info = download_version_info(version, None, None, Some(true)).await?; - download_minecraft_ingressed(&version_info, "x86", Some(true)).await?; + let minecraft_updated = true; + + download_minecraft_ingressed(&version_info, "x86", minecraft_updated, Some(true)).await?; Ok(()) -} \ No newline at end of file +} diff --git a/packages/core/src/api/cluster/mod.rs b/packages/core/src/api/cluster/mod.rs index bdd64350..6a6268d3 100644 --- a/packages/core/src/api/cluster/mod.rs +++ b/packages/core/src/api/cluster/mod.rs @@ -173,15 +173,16 @@ async fn install_cluster(cluster: &clusters::Model, force: Option) -> Laun let state = State::get().await?; let mut metadata = state.metadata.write().await; + let versions_list = &metadata.get_vanilla_or_fetch().await?.versions; - let version = metadata - .get_vanilla_or_fetch() - .await? - .versions + let version_index = versions_list .iter() - .find(|v| v.id == cluster.mc_version) - .ok_or_else(|| ClusterError::InvalidVersion(cluster.mc_version.clone()))? - .clone(); + .position(|v| v.id == cluster.mc_version) + .ok_or_else(|| ClusterError::InvalidVersion(cluster.mc_version.clone()))?; + + let version = versions_list[version_index].clone(); + + let minecraft_updated = metadata::is_version_updated(version_index, &versions_list); drop(metadata); @@ -218,6 +219,7 @@ async fn install_cluster(cluster: &clusters::Model, force: Option) -> Laun &version_info, &java_version.arch, Some(&SubIngress::new(&ingress_id, INGRESS_STEP)), + minecraft_updated, force, ) .await?; diff --git a/packages/core/src/api/game/arguments.rs b/packages/core/src/api/game/arguments.rs index 96cd7b27..521f50b7 100644 --- a/packages/core/src/api/game/arguments.rs +++ b/packages/core/src/api/game/arguments.rs @@ -17,6 +17,7 @@ use crate::utils::io; #[allow(clippy::too_many_arguments)] pub fn java_arguments( + version_updated: bool, arguments: Option<&[Argument]>, natives_path: &Path, libraries_path: &Path, @@ -29,6 +30,7 @@ pub fn java_arguments( let mut parsed = Vec::new(); if let Some(args) = arguments { parse_arguments( + version_updated, args, &mut parsed, |a| { @@ -67,6 +69,7 @@ pub fn java_arguments( #[allow(clippy::too_many_arguments)] pub fn minecraft_arguments( + version_updated: bool, args: Option<&[Argument]>, legacy_args: Option<&str>, creds: &MinecraftCredentials, @@ -81,6 +84,7 @@ pub fn minecraft_arguments( if let Some(args) = args { let mut parsed = Vec::new(); parse_arguments( + version_updated, args, &mut parsed, |arg| { @@ -341,6 +345,7 @@ pub fn get_library( } fn parse_arguments( + version_updated: bool, args: &[Argument], parsed: &mut Vec, parse_function: ParseFn, @@ -358,7 +363,7 @@ where } } Argument::Ruled { rules, value } => { - if super::rules::validate_rules(rules, java_arch, true) { + if super::rules::validate_rules(rules, java_arch, version_updated) { match value { ArgumentValue::Single(arg) => { parsed.push(parse_function(&arg.replace(' ', DUMMY_REPLACE_NEWLINE))?); diff --git a/packages/core/src/api/game/launch.rs b/packages/core/src/api/game/launch.rs index 75cc1bc6..c18c8d28 100644 --- a/packages/core/src/api/game/launch.rs +++ b/packages/core/src/api/game/launch.rs @@ -58,7 +58,7 @@ pub async fn launch_minecraft( .ok_or_else(|| anyhow::anyhow!("invalid game version {}", cluster.mc_version))?; let version = versions[version_index].clone(); - let updated = version_index <= versions.iter().position(|x| x.id == "22w16a").unwrap_or(0); + let updated = metadata::is_version_updated(version_index, versions); let loader_version = metadata::get_loader_version( &cluster.mc_version, @@ -116,6 +116,7 @@ pub async fn launch_minecraft( command .args( arguments::java_arguments( + updated, args.get(&interpulse::api::minecraft::ArgumentType::Jvm) .map(Vec::as_slice), &dirs.natives_dir().join(&version_name), @@ -137,6 +138,7 @@ pub async fn launch_minecraft( .arg(version_info.main_class.clone()) .args( arguments::minecraft_arguments( + updated, args.get(&interpulse::api::minecraft::ArgumentType::Game) .map(Vec::as_slice), version_info.minecraft_arguments.as_deref(), diff --git a/packages/core/src/api/game/metadata.rs b/packages/core/src/api/game/metadata.rs index 6c5bf8b9..a5061f98 100644 --- a/packages/core/src/api/game/metadata.rs +++ b/packages/core/src/api/game/metadata.rs @@ -18,6 +18,7 @@ use crate::utils::{http, io}; pub async fn download_minecraft_ingressed( version: &VersionInfo, java_arch: &str, + minecraft_updated: bool, force: Option, ) -> LauncherResult<()> { let id = init_ingress( @@ -31,6 +32,7 @@ pub async fn download_minecraft_ingressed( version, java_arch, Some(&SubIngress::new(&id, 100.0)), + minecraft_updated, force, ) .await @@ -42,13 +44,15 @@ pub async fn download_minecraft( version: &VersionInfo, java_arch: &str, sub_ingress: Option<&SubIngress<'_>>, + // if the version is newer than 22w16a, this should be true + minecraft_updated: bool, force: Option, ) -> LauncherResult<()> { let asset_index = download_assets_index(version, sub_ingress, force).await?; tokio::try_join! { download_assets(version.assets == "legacy", asset_index, sub_ingress, force), download_client(version, sub_ingress, force), - download_libraries(version.id.clone(), version.libraries.clone(), java_arch.to_string(), sub_ingress, force), + download_libraries(version.id.clone(), version.libraries.clone(), java_arch.to_string(), sub_ingress, minecraft_updated, force), }?; Ok(()) @@ -282,6 +286,7 @@ pub async fn download_libraries( libraries: Vec, java_arch: String, ingress: Option<&SubIngress<'_>>, + minecraft_updated: bool, force: Option, ) -> LauncherResult { tracing::debug!("loading libraries for version {}", version); @@ -304,7 +309,7 @@ pub async fn download_libraries( async move { if let Some(rules) = &lib.rules - && !super::rules::validate_rules(rules, &java_arch, lib.natives.is_some()) { + && !super::rules::validate_rules(rules, &java_arch, minecraft_updated) { tracing::debug!("skipping library {} due to rules", lib.name); return Ok::<(), LauncherError>(()); } @@ -455,3 +460,7 @@ pub async fn get_loaders_for_version(mc_version: &str) -> LauncherResult bool { + version_index <= versions.iter().position(|x| x.id == "22w16a").unwrap_or(0) +} diff --git a/packages/core/src/api/game/rules.rs b/packages/core/src/api/game/rules.rs index 351f1ca5..9f3991ed 100644 --- a/packages/core/src/api/game/rules.rs +++ b/packages/core/src/api/game/rules.rs @@ -1,5 +1,4 @@ use interpulse::api::minecraft::{Os, OsRule, Rule, RuleAction}; -use regex::Regex; use crate::utils::os_ext::OsExt; @@ -75,11 +74,5 @@ pub fn validate_os_rule(rule: &OsRule, java_arch: &str, updated: bool) -> bool { } } - if let Some(version) = &rule.version - && let Ok(regex) = Regex::new(version.as_str()) - { - rule_match &= regex.is_match(&sysinfo::System::os_version().unwrap_or_default()); - } - rule_match } diff --git a/packages/core/src/api/java/mod.rs b/packages/core/src/api/java/mod.rs index 511d647e..dfea3c2a 100644 --- a/packages/core/src/api/java/mod.rs +++ b/packages/core/src/api/java/mod.rs @@ -157,7 +157,12 @@ pub async fn get_recommended_java( } pub async fn prepare_java(major: u32) -> LauncherResult { - let id = init_ingress(IngressType::JavaPrepare, "preparing java", 100.0).await?; + let id = init_ingress( + IngressType::JavaPrepare, + &format!("preparing java {}", major), + 100.0, + ) + .await?; let java = dao::get_latest_java_by_major(major).await?; if let Some(java) = &java { @@ -389,8 +394,15 @@ pub async fn install_java_package(package: JavaPackage) -> LauncherResult