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

View file

@ -8,9 +8,7 @@ use crate::honkai::consts::launcher_dir;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Patch {
pub path: PathBuf,
pub servers: Vec<String>,
pub apply_mfplat: bool,
pub root: bool
pub apply_mfplat: bool
}
impl Default for Patch {
@ -21,18 +19,10 @@ impl Default for Patch {
Self {
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+
// which is recommended by default, so will work
// for most of users
apply_mfplat: false,
// Disable root requirement for patching if we're running launcher in flatpak
root: !PathBuf::from("/.flatpak-info").exists()
apply_mfplat: false
}
}
}
@ -42,40 +32,14 @@ impl From<&JsonValue> for Patch {
let default = Self::default();
Self {
path: match value.get("path") {
Some(value) => match value.as_str() {
Some(value) => PathBuf::from(value),
path: match value.get("path").and_then(|path| path.as_str()).map(PathBuf::from) {
Some(path) => 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") {
Some(value) => value.as_bool().unwrap_or(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,
MfplatPatchAvailable,
MainPatchAvailable(MainPatch),
PatchNotVerified,
PatchBroken,
PatchUnsafe,
PatchNotInstalled,
PatchUpdateAvailable,
#[cfg(feature = "components")]
WineNotInstalled,
@ -35,7 +41,6 @@ pub struct LauncherStateParams<F: Fn(StateUpdating)> {
pub wine_prefix: PathBuf,
pub game_path: PathBuf,
pub patch_servers: Vec<String>,
pub patch_folder: PathBuf,
pub apply_mfplat: bool,
@ -59,35 +64,29 @@ impl LauncherState {
let diff = game.try_get_diff()?;
match diff {
VersionDiff::Latest(_) => {
VersionDiff::Latest(version) => {
// Check game patch status
(params.status_updater)(StateUpdating::Patch);
// 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);
}
let patch = Patch::new(&params.patch_folder);
// 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;
}
}
if !jadeite::is_installed(&params.patch_folder) {
return Ok(Self::PatchNotInstalled);
}
// Check main patch status
let player_patch = patch.main_patch()?;
if !player_patch.is_applied(&params.game_path)? {
return Ok(Self::MainPatchAvailable(player_patch));
if jadeite::get_latest()?.version > jadeite::get_version(params.patch_folder)? {
return Ok(Self::PatchUpdateAvailable);
}
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)),
@ -115,7 +114,6 @@ impl LauncherState {
wine_prefix: config.get_wine_prefix_path(),
game_path: config.game.path,
patch_servers: config.patch.servers,
patch_folder: config.patch.path,
apply_mfplat: config.patch.apply_mfplat,