Faster speeds

This commit is contained in:
2026-04-04 08:15:48 +02:00
parent 9890428755
commit b3f1ad4573
2 changed files with 32 additions and 18 deletions
+25 -16
View File
@@ -21,12 +21,12 @@ use lyceris::{
},
},
minecraft::{
install::FileType, CLASSPATH_SEPARATOR, JAVA_MANIFEST_ENDPOINT, RESOURCES_ENDPOINT,
VERSION_MANIFEST_ENDPOINT,
emitter::{Emit, Event},
install::FileType,
CLASSPATH_SEPARATOR, JAVA_MANIFEST_ENDPOINT, RESOURCES_ENDPOINT, VERSION_MANIFEST_ENDPOINT,
},
util::{
extract::{extract_file, read_file_from_jar},
hash::calculate_sha1,
json::{read_json, write_json},
},
};
@@ -44,7 +44,6 @@ use crate::launcher::downloader::{download, download_multiple};
#[derive(Clone)]
struct DownloadFile {
file_name: String,
sha1: String,
url: String,
path: PathBuf,
r#type: FileType,
@@ -63,13 +62,25 @@ pub async fn install<T: Loader>(
config: &Config<T>,
emitter: Option<&Emitter>,
) -> lyceris::Result<()> {
let manifest: VersionManifest =
fetch(VERSION_MANIFEST_ENDPOINT, config.client.as_ref()).await?;
emitter.emit(Event::Console, "Fetching manifest...").await;
let (manifest, java_manifest) = tokio::join!(
fetch(VERSION_MANIFEST_ENDPOINT, config.client.as_ref()),
fetch(JAVA_MANIFEST_ENDPOINT, config.client.as_ref())
);
let manifest = manifest?;
let java_manifest = java_manifest?;
let version_json_path = config.get_version_json_path();
let mut meta: VersionMeta = if !version_json_path.exists() {
emitter
.emit(Event::Console, "Fetching version metadata")
.await;
let mut meta =
fetch_version_meta(&manifest, &config.version, config.client.as_ref()).await?;
if let Some(loader) = &config.loader {
emitter.emit(Event::Console, "Resolving loader").await;
meta = loader.merge(&config.into_vanilla(), meta, emitter).await?;
}
write_json(&version_json_path, &meta).await?;
@@ -78,6 +89,8 @@ pub async fn install<T: Loader>(
read_json(&version_json_path).await?
};
emitter.emit(Event::Console, "Fetching assets index").await;
let asset_index_path = config
.get_indexes_path()
.join(format!("{}.json", &meta.asset_index.id));
@@ -95,6 +108,8 @@ pub async fn install<T: Loader>(
create_dir_all(&natives_path)?;
}
emitter.emit(Event::Console, "Configuring files").await;
let check_natives = fs::read_dir(&natives_path)?.count() == 0;
let mut to_be_extracted = Vec::with_capacity(10);
@@ -102,7 +117,6 @@ pub async fn install<T: Loader>(
let java_version = meta.java_version.as_ref().unwrap_or(&default_java_version);
let runtime_path = config.get_runtime_path().join(&java_version.component);
let java_manifest: JavaManifest = fetch(JAVA_MANIFEST_ENDPOINT, config.client.as_ref()).await?;
let java_url = get_java_url(&java_manifest, java_version)?;
let java_files: JavaFileManifest = fetch(java_url, config.client.as_ref()).await?;
@@ -116,6 +130,8 @@ pub async fn install<T: Loader>(
&mut to_be_extracted,
)?;
emitter.emit(Event::Console, "Downloading files").await;
download_necessary(
file_map,
&config.game_dir,
@@ -251,9 +267,7 @@ fn build_file_map(
to_be_extracted: &mut Vec<vanilla::File>,
) -> lyceris::Result<Vec<DownloadFile>> {
let version_jar_path = config.get_version_jar_path();
let version_download = if !version_jar_path.exists()
|| !calculate_sha1(&version_jar_path)?.eq(&meta.downloads.client.sha1)
{
let version_download = if !version_jar_path.exists() {
Some(DownloadFile {
file_name: version_jar_path
.file_name()
@@ -262,7 +276,6 @@ fn build_file_map(
.to_string(),
r#type: FileType::Library,
path: version_jar_path,
sha1: meta.downloads.client.sha1.clone(),
url: meta.downloads.client.url.clone(),
})
} else {
@@ -277,7 +290,6 @@ fn build_file_map(
let hash = &meta.hash;
DownloadFile {
file_name: key.clone(),
sha1: hash.clone(),
url: format!("{}/{}/{}", RESOURCES_ENDPOINT, &hash[0..2], hash),
path: assets_path.join("objects").join(&hash[0..2]).join(hash),
r#type: FileType::Asset {
@@ -324,7 +336,6 @@ fn build_file_map(
.unwrap_or_default()
.to_string_lossy()
.to_string(),
sha1,
url,
path,
r#type: FileType::Library,
@@ -340,7 +351,6 @@ fn build_file_map(
.unwrap_or_default()
.to_string_lossy()
.to_string(),
sha1: artifact.sha1.clone(),
url: artifact.url.clone(),
path: config
.game_dir
@@ -363,7 +373,6 @@ fn build_file_map(
.unwrap_or(name)
.to_string(),
path,
sha1: downloads.raw.sha1.clone(),
url: downloads.raw.url.clone(),
r#type: FileType::Java,
})
@@ -565,7 +574,7 @@ async fn download_necessary(
}
}
if !target_path.exists() || calculate_sha1(&target_path).ok()? != file.sha1 {
if !target_path.exists() {
fs::copy(&file.path, &target_path).ok();
}
+7 -2
View File
@@ -6,6 +6,7 @@ use lyceris::minecraft::{
config::ConfigBuilder,
emitter::{Emitter, Event},
launch::launch,
loader::fabric::Fabric,
};
use once_cell::sync::Lazy;
@@ -56,22 +57,26 @@ pub async fn launch_game() -> Result<(), String> {
let current_dir = LAUNCHER_DIR.data_dir();
let config = ConfigBuilder::new(
current_dir.join("game"),
current_dir.join("1.21.4"),
"1.21.4".into(),
lyceris::auth::AuthMethod::Offline {
username: "Lyceris".into(),
// If none given, it will be generated.
uuid: None,
},
)
.loader(Fabric("0.18.6".to_string()).into())
.build();
println!("Starting installation");
// Install method also checks for broken files
// and downloads them again if they are broken.
install::install(&config, Some(&emitter))
.await
.map_err(|e| e.to_string())?;
println!("Finished installing");
// This method never downloads any file and just runs the game.
launch(&config, Some(&emitter))
.await