- implemented jadeite patch for hi3rd
This commit is contained in:
Observer KRypt0n_ 2023-06-10 22:35:43 +02:00
parent 40708d6b10
commit 6662d6516d
No known key found for this signature in database
GPG key ID: 844DA47BA25FE1E2
3 changed files with 29 additions and 64 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "anime-launcher-sdk" name = "anime-launcher-sdk"
version = "1.7.0" version = "1.7.1"
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"] authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
license = "GPL-3.0" license = "GPL-3.0"
readme = "README.md" readme = "README.md"
@ -9,7 +9,7 @@ edition = "2021"
[dependencies.anime-game-core] [dependencies.anime-game-core]
git = "https://github.com/an-anime-team/anime-game-core" git = "https://github.com/an-anime-team/anime-game-core"
tag = "1.12.0" tag = "1.12.1"
features = ["all"] features = ["all"]
# path = "../anime-game-core" # ! for dev purposes only # path = "../anime-game-core" # ! for dev purposes only
@ -37,7 +37,10 @@ pgr = ["anime-game-core/pgr"]
genshin-patch = ["anime-game-core/patch-dawn"] genshin-patch = ["anime-game-core/patch-dawn"]
star-rail-patch = ["anime-game-core/patch-jadeite"] star-rail-patch = ["anime-game-core/patch-jadeite"]
honkai-patch = ["anime-game-core/patch-jadeite"] honkai-patch = [
"anime-game-core/patch-jadeite",
"anime-game-core/patch-mfplat"
]
# Common features # Common features
states = [] states = []

View file

@ -8,9 +8,7 @@ use crate::honkai::consts::launcher_dir;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Patch { pub struct Patch {
pub path: PathBuf, pub path: PathBuf,
pub servers: Vec<String>, pub apply_mfplat: bool
pub apply_mfplat: bool,
pub root: bool
} }
impl Default for Patch { impl Default for Patch {
@ -21,18 +19,10 @@ impl Default for Patch {
Self { Self {
path: launcher_dir.join("patch"), path: launcher_dir.join("patch"),
servers: vec![
String::from("https://codeberg.org/an-anime-team/dusk"),
String::from("https://notabug.org/mkrsym1/dusk")
],
// Seems to not be needed with wine 8+ // Seems to not be needed with wine 8+
// which is recommended by default, so will work // which is recommended by default, so will work
// for most of users // for most of users
apply_mfplat: false, apply_mfplat: false
// Disable root requirement for patching if we're running launcher in flatpak
root: !PathBuf::from("/.flatpak-info").exists()
} }
} }
} }
@ -42,40 +32,14 @@ impl From<&JsonValue> for Patch {
let default = Self::default(); let default = Self::default();
Self { Self {
path: match value.get("path") { path: match value.get("path").and_then(|path| path.as_str()).map(PathBuf::from) {
Some(value) => match value.as_str() { Some(path) => path,
Some(value) => PathBuf::from(value),
None => default.path None => default.path
}, },
None => default.path
},
servers: match value.get("servers") {
Some(value) => match value.as_array() {
Some(values) => {
let mut servers = Vec::new();
for value in values {
if let Some(server) = value.as_str() {
servers.push(server.to_string());
}
}
servers
},
None => default.servers
},
None => default.servers
},
apply_mfplat: match value.get("apply_mfplat") { apply_mfplat: match value.get("apply_mfplat") {
Some(value) => value.as_bool().unwrap_or(default.apply_mfplat), Some(value) => value.as_bool().unwrap_or(default.apply_mfplat),
None => default.apply_mfplat None => default.apply_mfplat
},
root: match value.get("root") {
Some(value) => value.as_bool().unwrap_or(default.root),
None => default.root
} }
} }
} }

View file

@ -10,7 +10,13 @@ pub enum LauncherState {
Launch, Launch,
MfplatPatchAvailable, MfplatPatchAvailable,
MainPatchAvailable(MainPatch),
PatchNotVerified,
PatchBroken,
PatchUnsafe,
PatchNotInstalled,
PatchUpdateAvailable,
#[cfg(feature = "components")] #[cfg(feature = "components")]
WineNotInstalled, WineNotInstalled,
@ -35,7 +41,6 @@ pub struct LauncherStateParams<F: Fn(StateUpdating)> {
pub wine_prefix: PathBuf, pub wine_prefix: PathBuf,
pub game_path: PathBuf, pub game_path: PathBuf,
pub patch_servers: Vec<String>,
pub patch_folder: PathBuf, pub patch_folder: PathBuf,
pub apply_mfplat: bool, pub apply_mfplat: bool,
@ -59,35 +64,29 @@ impl LauncherState {
let diff = game.try_get_diff()?; let diff = game.try_get_diff()?;
match diff { match diff {
VersionDiff::Latest(_) => { VersionDiff::Latest(version) => {
// Check game patch status // Check game patch status
(params.status_updater)(StateUpdating::Patch); (params.status_updater)(StateUpdating::Patch);
// Check if mfplat patch is needed // Check if mfplat patch is needed
if params.apply_mfplat && !MfplatPatch::is_applied(&params.wine_prefix)? { if params.apply_mfplat && !mfplat::is_applied(&params.wine_prefix)? {
return Ok(Self::MfplatPatchAvailable); return Ok(Self::MfplatPatchAvailable);
} }
let patch = Patch::new(&params.patch_folder); if !jadeite::is_installed(&params.patch_folder) {
return Ok(Self::PatchNotInstalled);
// Sync local patch folder with remote if needed
// TODO: maybe I shouldn't do it here?
if patch.is_sync(&params.patch_servers)?.is_none() {
for server in &params.patch_servers {
if patch.sync(server).is_ok() {
break;
}
}
} }
// Check main patch status if jadeite::get_latest()?.version > jadeite::get_version(params.patch_folder)? {
let player_patch = patch.main_patch()?; return Ok(Self::PatchUpdateAvailable);
if !player_patch.is_applied(&params.game_path)? {
return Ok(Self::MainPatchAvailable(player_patch));
} }
Ok(Self::Launch) match jadeite::get_metadata()?.hsr.global.get_status(version) {
JadeitePatchStatusVariant::Verified => Ok(Self::Launch),
JadeitePatchStatusVariant::Unverified => Ok(Self::PatchNotVerified),
JadeitePatchStatusVariant::Broken => Ok(Self::PatchBroken),
JadeitePatchStatusVariant::Unsafe => Ok(Self::PatchUnsafe)
}
} }
VersionDiff::Diff { .. } => Ok(Self::GameUpdateAvailable(diff)), VersionDiff::Diff { .. } => Ok(Self::GameUpdateAvailable(diff)),
@ -115,7 +114,6 @@ impl LauncherState {
wine_prefix: config.get_wine_prefix_path(), wine_prefix: config.get_wine_prefix_path(),
game_path: config.game.path, game_path: config.game.path,
patch_servers: config.patch.servers,
patch_folder: config.patch.path, patch_folder: config.patch.path,
apply_mfplat: config.patch.apply_mfplat, apply_mfplat: config.patch.apply_mfplat,