diff --git a/packages/app-lib/src/state/instance_types.rs b/packages/app-lib/src/state/instance_types.rs index 6a68b1aea72..48c72572274 100644 --- a/packages/app-lib/src/state/instance_types.rs +++ b/packages/app-lib/src/state/instance_types.rs @@ -171,6 +171,19 @@ impl ProjectType { } } + pub fn get_from_version_file( + loaders: Vec, + file_name: &str, + ) -> Option { + let is_zip = Path::new(file_name) + .extension() + .is_some_and(|ext| ext.eq_ignore_ascii_case("zip")); + if is_zip && loaders.iter().any(|x| x == "datapack") { + return Some(ProjectType::DataPack); + } + Self::get_from_loaders(loaders) + } + pub fn get_from_parent_folder(path: impl AsRef) -> Option { match path .as_ref() diff --git a/packages/app-lib/src/state/instances/commands/apply_content_install.rs b/packages/app-lib/src/state/instances/commands/apply_content_install.rs index 29ab8e33307..7d865e51eeb 100644 --- a/packages/app-lib/src/state/instances/commands/apply_content_install.rs +++ b/packages/app-lib/src/state/instances/commands/apply_content_install.rs @@ -248,9 +248,19 @@ pub(crate) async fn switch_project_version_with_dependencies( .ok_or(ErrorKind::InputError(format!( "unable to install version id {version_id}, not found" )))?; - let content_type = ProjectType::get_from_loaders(version.loaders.clone()) - .map(ContentType::from) - .unwrap_or(ContentType::Mod); + let primary_file_name = version + .files + .iter() + .find(|file| file.primary) + .or_else(|| version.files.first()) + .map(|file| file.filename.as_str()) + .unwrap_or_default(); + let content_type = ProjectType::get_from_version_file( + version.loaders.clone(), + primary_file_name, + ) + .map(ContentType::from) + .unwrap_or(ContentType::Mod); let plan = resolve_install_plan( instance_id, InstanceInstallProjectRequest { @@ -433,8 +443,11 @@ pub(crate) async fn download_project_version_with_progress( progress, ) .await?; - let project_type = ProjectType::get_from_loaders(version.loaders.clone()) - .ok_or(ErrorKind::InputError(format!( + let project_type = ProjectType::get_from_version_file( + version.loaders.clone(), + &file.filename, + ) + .ok_or(ErrorKind::InputError(format!( "unable to infer project type for version {version_id}" )))?; let project_id = version.project_id.clone();