From 5d8e4d7311261d80d55ba71628a80c499279b3c2 Mon Sep 17 00:00:00 2001 From: Thoronium <107363768+NotThorny@users.noreply.github.com> Date: Sat, 8 Apr 2023 15:55:00 -0600 Subject: [PATCH 1/6] Fix download buttons getting stuck --- src/utils/download.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/utils/download.ts b/src/utils/download.ts index 1c47ff4..75c50b8 100644 --- a/src/utils/download.ts +++ b/src/utils/download.ts @@ -101,25 +101,25 @@ export default class DownloadHandler { downloadingJar() { // Kinda hacky but it works - return this.downloads.some((d) => d.path.includes('grasscutter.zip')) + return this.downloads.some((d) => d.path.includes('grasscutter.zip') && (d.status != ('finished' || 'error'))) } downloadingFullBuild() { // Kinda hacky but it works - return this.downloads.some((d) => d.path.includes('GrasscutterCulti')) + return this.downloads.some((d) => d.path.includes('GrasscutterCulti') && (d.status != ('finished' || 'error'))) } downloadingResources() { // Kinda hacky but it works - return this.downloads.some((d) => d.path.includes('resources')) + return this.downloads.some((d) => d.path.includes('resources') && (d.status != ('finished' || 'error'))) } downloadingRepo() { - return this.downloads.some((d) => d.path.includes('grasscutter_repo.zip')) + return this.downloads.some((d) => d.path.includes('grasscutter_repo.zip') && (d.status != ('finished' || 'error'))) } downloadingMigoto() { - return this.downloads.some((d) => d.path.includes('3dmigoto')) + return this.downloads.some((d) => d.path.includes('3dmigoto') && (d.status != ('finished' || 'error'))) } addDownload(url: string, path: string, onFinish?: () => void) { From 864f9f199cc30f4a0b91127f4340df277d650385 Mon Sep 17 00:00:00 2001 From: Thoronium <107363768+NotThorny@users.noreply.github.com> Date: Sun, 9 Apr 2023 17:22:31 -0600 Subject: [PATCH 2/6] Fix mods appearing suck on extraction --- src/utils/download.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/download.ts b/src/utils/download.ts index 75c50b8..c4957fc 100644 --- a/src/utils/download.ts +++ b/src/utils/download.ts @@ -90,7 +90,7 @@ export default class DownloadHandler { } = payload // Find the download that is not extracting and set it's status as such - const index = this.downloads.findIndex((download) => download.path === obj.file || obj.new_folder) + const index = this.downloads.findIndex((download) => download.path === obj.file) this.downloads[index].status = 'finished' }) } From 33ce547bb214c37d9fa18b7ea8dc50f7208205ba Mon Sep 17 00:00:00 2001 From: Thoronium <107363768+NotThorny@users.noreply.github.com> Date: Tue, 11 Apr 2023 23:14:32 -0600 Subject: [PATCH 3/6] Remove unnecessary duplicate patch --- src/utils/rsa.ts | 43 ++++--------------------------------------- 1 file changed, 4 insertions(+), 39 deletions(-) diff --git a/src/utils/rsa.ts b/src/utils/rsa.ts index 1c8ebd7..7bf6071 100644 --- a/src/utils/rsa.ts +++ b/src/utils/rsa.ts @@ -1,25 +1,12 @@ import { invoke } from '@tauri-apps/api' -import { dataDir } from '@tauri-apps/api/path' import { getGameFolder } from './game' +// Patch file from: https://github.com/34736384/RSAPatch/ export async function patchGame() { - // Do we have a patch already? - const patchedExists = await invoke('dir_exists', { - path: (await getBackupRSAPath()) + '\\version.dll', - }) - - if (!patchedExists) { - // No patch found? Patching creates one - const patched = await downloadRSA() - - if (!patched) { - return false - } - } - + const patchPath = (await invoke('install_location')) + '\\patch\\version.dll' // Are we already patched with mhypbase? If so, that's fine, just continue as normal const gameIsPatched = await invoke('are_files_identical', { - path1: (await getBackupRSAPath()) + '\\version.dll', + path1: patchPath, path2: (await getGameRSAPath()) + '\\mhypbase.dll', }) @@ -31,7 +18,7 @@ export async function patchGame() { // Copy the patch to game files const replaced = await invoke('copy_file_with_new_name', { - path: (await getBackupRSAPath()) + '\\version.dll', + path: patchPath, newPath: await getGameRSAPath(), newName: 'version.dll', }) @@ -61,25 +48,3 @@ export async function getGameRSAPath() { return (gameData + '\\').replace(/\\/g, '/') } - -export async function getBackupRSAPath() { - return (await dataDir()) + 'cultivation\\rsa' -} - -export async function downloadRSA() { - // Patch file from: https://github.com/34736384/RSAPatch/ - - // Should make sure rsa path exists - await invoke('dir_create', { - path: await getBackupRSAPath(), - }) - - // Copy patch from local for offline compatibility - await invoke('copy_file_with_new_name', { - path: (await invoke('install_location')) + '\\patch\\version.dll', - newPath: await getBackupRSAPath(), - newName: 'version.dll', - }) - - return true -} From 5de80f16559a2b2d36a9033bafcd6244e790a0b3 Mon Sep 17 00:00:00 2001 From: Thoronium <107363768+NotThorny@users.noreply.github.com> Date: Wed, 12 Apr 2023 20:37:24 -0600 Subject: [PATCH 4/6] Auto-remove spaces from address --- src-tauri/src/proxy.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/proxy.rs b/src-tauri/src/proxy.rs index b751b21..67ec353 100644 --- a/src-tauri/src/proxy.rs +++ b/src-tauri/src/proxy.rs @@ -41,7 +41,13 @@ struct ProxyHandler; #[tauri::command] pub fn set_proxy_addr(addr: String) { - *SERVER.lock().unwrap() = addr; + if addr.contains(" ") { + let addr2 = addr.replace(" ", ""); + *SERVER.lock().unwrap() = addr2; + } else { + *SERVER.lock().unwrap() = addr; + } + } #[async_trait] From 7bfa5e8e11504fa7c1166276c5b4ebb996465dea Mon Sep 17 00:00:00 2001 From: Thoronium <107363768+NotThorny@users.noreply.github.com> Date: Fri, 14 Apr 2023 23:22:34 -0600 Subject: [PATCH 5/6] Add non-elevated game option --- src-tauri/lang/chs.json | 3 ++- src-tauri/lang/cht.json | 3 ++- src-tauri/lang/de.json | 3 ++- src-tauri/lang/en.json | 3 ++- src-tauri/lang/es.json | 3 ++- src-tauri/lang/fr.json | 3 ++- src-tauri/lang/id.json | 3 ++- src-tauri/lang/ko.json | 3 ++- src-tauri/lang/lv.json | 3 ++- src-tauri/lang/nl.json | 3 ++- src-tauri/lang/pt-br.json | 3 ++- src-tauri/lang/ru.json | 3 ++- src-tauri/lang/vi.json | 3 ++- src-tauri/src/main.rs | 1 + src-tauri/src/system_helpers.rs | 12 +++++++++++ src/ui/components/ServerLaunchSection.tsx | 13 +++++++++++- src/ui/components/menu/Options.tsx | 25 +++++++++++++++++++++++ src/utils/configuration.ts | 2 ++ 18 files changed, 78 insertions(+), 14 deletions(-) diff --git a/src-tauri/lang/chs.json b/src-tauri/lang/chs.json index 9ac180a..b1ef5d3 100644 --- a/src-tauri/lang/chs.json +++ b/src-tauri/lang/chs.json @@ -29,7 +29,8 @@ "use_proxy": "使用内置代理", "wipe_login": "清除登录缓存", "horny_mode": "Horny 模式", - "auto_mongodb": "自动启动 MongoDB" + "auto_mongodb": "自动启动 MongoDB", + "un_elevated": "非提升运行游戏(无管理员)" }, "downloads": { "grasscutter_fullbuild": "下载 Grasscutter 一体化", diff --git a/src-tauri/lang/cht.json b/src-tauri/lang/cht.json index 0d1b080..c30fe8f 100644 --- a/src-tauri/lang/cht.json +++ b/src-tauri/lang/cht.json @@ -29,7 +29,8 @@ "use_proxy": "使用內建代理伺服器", "wipe_login": "擦除登錄緩存", "horny_mode": "Horny模式", - "auto_mongodb": "自動啟動 MongoDB" + "auto_mongodb": "自動啟動 MongoDB", + "un_elevated": "在不升高的情况下运行游戏(没有管理员)。" }, "downloads": { "grasscutter_fullbuild": "下載Grasscutter多合一下載", diff --git a/src-tauri/lang/de.json b/src-tauri/lang/de.json index 4bc9402..c493215 100644 --- a/src-tauri/lang/de.json +++ b/src-tauri/lang/de.json @@ -28,7 +28,8 @@ "use_proxy": "Gebruik interne proxy", "wipe_login": "Wis de inlogcache", "horny_mode": "Geile modus", - "auto_mongodb": "Start automatisch MongoDB" + "auto_mongodb": "Start automatisch MongoDB", + "un_elevated": "Führen Sie das Spiel nicht erhöht aus (kein Admin)" }, "downloads": { "grasscutter_fullbuild": "Alles in Einem Grasscutter Daten herunterladen", diff --git a/src-tauri/lang/en.json b/src-tauri/lang/en.json index db6b0f2..d0b13af 100644 --- a/src-tauri/lang/en.json +++ b/src-tauri/lang/en.json @@ -29,7 +29,8 @@ "use_proxy": "Use Internal Proxy", "wipe_login": "Wipe Login Cache", "horny_mode": "Horny Mode", - "auto_mongodb": "Automatically Start MongoDB" + "auto_mongodb": "Automatically Start MongoDB", + "un_elevated": "Run the game non-elevated (no admin)" }, "downloads": { "grasscutter_fullbuild": "Download Grasscutter All-in-One", diff --git a/src-tauri/lang/es.json b/src-tauri/lang/es.json index 0a5bec5..e8ed0ea 100644 --- a/src-tauri/lang/es.json +++ b/src-tauri/lang/es.json @@ -29,7 +29,8 @@ "use_proxy": "Usar proxy interno", "wipe_login": "Borrar caché de inicio de sesión", "horny_mode": "Modo cachondo", - "auto_mongodb": "Iniciar automáticamente MongoDB" + "auto_mongodb": "Iniciar automáticamente MongoDB", + "un_elevated": "Ejecutar el juego no elevado (no admin)" }, "downloads": { "grasscutter_fullbuild": "Descargar Datos todo en uno de Grasscutter", diff --git a/src-tauri/lang/fr.json b/src-tauri/lang/fr.json index 43a2dbd..4b74aec 100644 --- a/src-tauri/lang/fr.json +++ b/src-tauri/lang/fr.json @@ -29,7 +29,8 @@ "use_proxy": "Utiliser un proxy interne", "wipe_login": "Effacer le cache de connexion", "horny_mode": "Mode excitation", - "auto_mongodb": "Démarrer automatiquement MongoDB" + "auto_mongodb": "Démarrer automatiquement MongoDB", + "un_elevated": "Exécuter le jeu sans élévation (pas d'administrateur)" }, "downloads": { "grasscutter_fullbuild": "Telecharger Grasscutter tout-en-un", diff --git a/src-tauri/lang/id.json b/src-tauri/lang/id.json index a56e70a..6ccf330 100644 --- a/src-tauri/lang/id.json +++ b/src-tauri/lang/id.json @@ -28,7 +28,8 @@ "use_proxy": "Gunakan Proxy Internal", "wipe_login": "Menghapus Cache Login", "horny_mode": "Mode Terangsang", - "auto_mongodb": "Mulai MongoDB secara otomatis" + "auto_mongodb": "Mulai MongoDB secara otomatis", + "un_elevated": "Jalankan game yang tidak ditinggikan (tanpa admin)" }, "downloads": { "grasscutter_fullbuild": "Sedang Mendownload Grasscutter Semua Dalam Satu", diff --git a/src-tauri/lang/ko.json b/src-tauri/lang/ko.json index 872c4f8..ed11c0f 100644 --- a/src-tauri/lang/ko.json +++ b/src-tauri/lang/ko.json @@ -29,7 +29,8 @@ "use_proxy": "내부 프록시 사용", "wipe_login": "로그인 캐시 지우기", "horny_mode": "Horny 모드", - "auto_mongodb": "MongoDB 자동 시작" + "auto_mongodb": "MongoDB 자동 시작", + "un_elevated": "게임 비상승 실행(관리자 없음)" }, "downloads": { "grasscutter_fullbuild": "올인원 Grasscutter 다운로드", diff --git a/src-tauri/lang/lv.json b/src-tauri/lang/lv.json index d8fa91b..adeced0 100644 --- a/src-tauri/lang/lv.json +++ b/src-tauri/lang/lv.json @@ -27,7 +27,8 @@ "use_proxy": "Izmantot iekšējo starpniekserveri", "wipe_login": "Noslaucīt pieteikšanās kešatmiņu", "horny_mode": "Uzbudināts režīms", - "auto_mongodb": "Automātiski startējiet MongoDB" + "auto_mongodb": "Automātiski startējiet MongoDB", + "un_elevated": "Palaist spēli bez paaugstinājuma (bez administratora)" }, "downloads": { "grasscutter_fullbuild": "Lejupielādējiet Grasscutter viss vienā", diff --git a/src-tauri/lang/nl.json b/src-tauri/lang/nl.json index 20aac3a..3d3d80b 100644 --- a/src-tauri/lang/nl.json +++ b/src-tauri/lang/nl.json @@ -28,7 +28,8 @@ "use_proxy": "Gebruik Interne Proxy", "wipe_login": "Login cache wissen", "horny_mode": "Geile modus", - "auto_mongodb": "Start automatisch MongoDB" + "auto_mongodb": "Start automatisch MongoDB", + "un_elevated": "Voer het spel uit zonder hoogtevrees (geen admin)" }, "downloads": { "grasscutter_fullbuild": "Grasscutter Alles-in-één Downloaden", diff --git a/src-tauri/lang/pt-br.json b/src-tauri/lang/pt-br.json index 555337f..79187b5 100644 --- a/src-tauri/lang/pt-br.json +++ b/src-tauri/lang/pt-br.json @@ -29,7 +29,8 @@ "use_proxy": "Usar Proxy Interno", "wipe_login": "Limpar Cache de Login", "horny_mode": "Modo com tesão", - "auto_mongodb": "Iniciar MongoDB Automaticamente" + "auto_mongodb": "Iniciar MongoDB Automaticamente", + "un_elevated": "Executar o jogo não-elevated (sem admin)" }, "downloads": { "grasscutter_fullbuild": "Baixar o Grasscutter Tudo-em-Um", diff --git a/src-tauri/lang/ru.json b/src-tauri/lang/ru.json index c637ee8..9171994 100644 --- a/src-tauri/lang/ru.json +++ b/src-tauri/lang/ru.json @@ -28,7 +28,8 @@ "use_proxy": "Использовать встроенный Прокси", "wipe_login": "Очистить кэш входа в систему", "horny_mode": "роговой режим", - "auto_mongodb": "Автоматически запускать MongoDB" + "auto_mongodb": "Автоматически запускать MongoDB", + "un_elevated": "Запустите игру в неэлегантном режиме (без администратора)" }, "downloads": { "grasscutter_fullbuild": "Скачать все в одном Grasscutter", diff --git a/src-tauri/lang/vi.json b/src-tauri/lang/vi.json index b664a29..b208f7d 100644 --- a/src-tauri/lang/vi.json +++ b/src-tauri/lang/vi.json @@ -29,7 +29,8 @@ "use_proxy": "Sử dụng proxy nội bộ", "wipe_login": "Tẩy sạch cache đăng nhập", "horny_mode": "Chế độ hứng tình", - "auto_mongodb": "Tự động khởi động MongoDB" + "auto_mongodb": "Tự động khởi động MongoDB", + "un_elevated": "Chạy trò chơi không nâng cao (không có quản trị viên)" }, "downloads": { "grasscutter_fullbuild": "Tải Grasscutter tất cả trong một", diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 163b11f..c62a063 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -105,6 +105,7 @@ fn main() { system_helpers::set_migoto_delay, system_helpers::wipe_registry, system_helpers::get_platform, + system_helpers::run_un_elevated, proxy::set_proxy_addr, proxy::generate_ca_files, unzip::unzip, diff --git a/src-tauri/src/system_helpers.rs b/src-tauri/src/system_helpers.rs index a681ecd..71c99b1 100644 --- a/src-tauri/src/system_helpers.rs +++ b/src-tauri/src/system_helpers.rs @@ -77,6 +77,18 @@ pub fn run_jar(path: String, execute_in: String, java_path: String) { }; } +#[tauri::command] +pub fn run_un_elevated(path: String) { + // Open the program non-elevated. + match open::with( + format!("cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"{}\"\"", path), + "C:\\Windows\\System32\\cmd.exe", + ) { + Ok(_) => (), + Err(e) => println!("Failed to open program ({}): {}", &path, e), + }; +} + #[tauri::command] pub fn open_in_browser(url: String) { // Open the URL in the default browser. diff --git a/src/ui/components/ServerLaunchSection.tsx b/src/ui/components/ServerLaunchSection.tsx index d5b5663..6594d56 100644 --- a/src/ui/components/ServerLaunchSection.tsx +++ b/src/ui/components/ServerLaunchSection.tsx @@ -39,6 +39,8 @@ interface IState { swag: boolean akebiSet: boolean migotoSet: boolean + + unElevated: boolean } export default class ServerLaunchSection extends React.Component { @@ -62,6 +64,7 @@ export default class ServerLaunchSection extends React.Component swag: false, akebiSet: false, migotoSet: false, + unElevated: false, } this.toggleGrasscutter = this.toggleGrasscutter.bind(this) @@ -93,6 +96,7 @@ export default class ServerLaunchSection extends React.Component swag: config.swag_mode || false, akebiSet: config.akebi_path !== '', migotoSet: config.migoto_path !== '', + unElevated: config.un_elevated || false, }) } @@ -188,7 +192,14 @@ export default class ServerLaunchSection extends React.Component path: exe || config.game_install_path, }) - if (gameExists) await invoke('run_program_relative', { path: exe || config.game_install_path }) + if (gameExists) + if (config.un_elevated) { + await invoke('run_un_elevated', { + path: config.game_install_path, + }) + } else { + await invoke('run_program_relative', { path: exe || config.game_install_path }) + } else alert('Game not found! At: ' + (exe || config.game_install_path)) } diff --git a/src/ui/components/menu/Options.tsx b/src/ui/components/menu/Options.tsx index 25168de..5ab915d 100644 --- a/src/ui/components/menu/Options.tsx +++ b/src/ui/components/menu/Options.tsx @@ -41,6 +41,7 @@ interface IState { auto_mongodb: boolean swag: boolean platform: string + un_elevated: boolean // Swag stuff akebi_path: string @@ -70,6 +71,7 @@ export default class Options extends React.Component { swag: false, auto_mongodb: false, platform: '', + un_elevated: false, // Swag stuff akebi_path: '', @@ -87,6 +89,7 @@ export default class Options extends React.Component { this.toggleEncryption = this.toggleEncryption.bind(this) this.removeRSA = this.removeRSA.bind(this) this.addMigotoDelay = this.addMigotoDelay.bind(this) + this.toggleUnElevatedGame = this.toggleUnElevatedGame.bind(this) } async componentDidMount() { @@ -119,6 +122,7 @@ export default class Options extends React.Component { swag: config.swag_mode || false, auto_mongodb: config.auto_mongodb || false, platform, + un_elevated: config.un_elevated || false, // Swag stuff akebi_path: config.akebi_path || '', @@ -274,6 +278,15 @@ export default class Options extends React.Component { } } + async toggleUnElevatedGame() { + const changedVal = !(await getConfigOption('un_elevated')) + setConfigOption('un_elevated', changedVal) + + this.setState({ + un_elevated: changedVal, + }) + } + async removeRSA() { await meta.unpatchGame() } @@ -455,6 +468,18 @@ export default class Options extends React.Component { /> + {this.state.swag ? (