Don't rely on xdelta3 python module
Don't crash if xdelta3 module is not present, and add the ability to download game & voicepack in CLI Bump to 1.2.8
This commit is contained in:
parent
2d6cff77c6
commit
e4cc701166
@ -31,6 +31,9 @@ class UI:
|
|||||||
answer = input(question + " (y/n): ")
|
answer = input(question + " (y/n): ")
|
||||||
return answer.lower() == 'y'
|
return answer.lower() == 'y'
|
||||||
|
|
||||||
|
def override_game_version(self, version: str):
|
||||||
|
self._installer._version = version
|
||||||
|
|
||||||
def get_game_version(self):
|
def get_game_version(self):
|
||||||
print(self._installer.get_game_version())
|
print(self._installer.get_game_version())
|
||||||
|
|
||||||
@ -40,9 +43,9 @@ class UI:
|
|||||||
print("Updating game from archive (this may takes some time)...")
|
print("Updating game from archive (this may takes some time)...")
|
||||||
self._installer.update_game(filepath)
|
self._installer.update_game(filepath)
|
||||||
|
|
||||||
def _install_from_archive(self, filepath):
|
def _install_from_archive(self, filepath, force_reinstall):
|
||||||
print("Installing game from archive (this may takes some time)...")
|
print("Installing game from archive (this may takes some time)...")
|
||||||
self._installer.install_game(filepath)
|
self._installer.install_game(filepath, force_reinstall)
|
||||||
|
|
||||||
def _apply_voiceover_from_archive(self, filepath):
|
def _apply_voiceover_from_archive(self, filepath):
|
||||||
print("Applying voiceover from archive (this may takes some time)...")
|
print("Applying voiceover from archive (this may takes some time)...")
|
||||||
@ -90,19 +93,44 @@ class UI:
|
|||||||
if not self._ask("Do you want to install the game? ({})".format(filepath)):
|
if not self._ask("Do you want to install the game? ({})".format(filepath)):
|
||||||
print("Aborting installation process.")
|
print("Aborting installation process.")
|
||||||
return
|
return
|
||||||
self._install_from_archive(filepath)
|
self._install_from_archive(filepath, False)
|
||||||
print("Game installed successfully.")
|
print("Game installed successfully.")
|
||||||
|
|
||||||
|
def download_game(self):
|
||||||
|
print("Downloading full game (This will take a long time)...")
|
||||||
|
asyncio.run(self._installer.download_full_game())
|
||||||
|
|
||||||
|
def download_game_update(self):
|
||||||
|
print("Downloading game update (This will take a long time)...")
|
||||||
|
asyncio.run(self._installer.download_game_update())
|
||||||
|
|
||||||
|
def download_voiceover(self, languages: str):
|
||||||
|
res_info = asyncio.run(self._launcher.get_resource_info())
|
||||||
|
for lng in languages.split(" "):
|
||||||
|
for vo in res_info.game.latest.voice_packs:
|
||||||
|
if not self._installer.voiceover_lang_translate(lng) == vo.language:
|
||||||
|
continue
|
||||||
|
print("Downloading voiceover pack for {} (This will take a long time)...".format(lng))
|
||||||
|
asyncio.run(self._installer.download_full_voiceover(lng))
|
||||||
|
|
||||||
|
def download_voiceover_update(self, languages: str):
|
||||||
|
res_info = asyncio.run(self._launcher.get_resource_info())
|
||||||
|
for lng in languages.split(" "):
|
||||||
|
for vo in res_info.game.latest.voice_packs:
|
||||||
|
if not self._installer.voiceover_lang_translate(lng) == vo.language:
|
||||||
|
continue
|
||||||
|
print("Downloading voiceover update pack for {} (This will take a long time)...".format(lng))
|
||||||
|
asyncio.run(self._installer.download_voiceover_update(lng))
|
||||||
|
|
||||||
def install_game(self, forced: bool = False):
|
def install_game(self, forced: bool = False):
|
||||||
res_info = asyncio.run(self._launcher.get_resource_info())
|
res_info = asyncio.run(self._launcher.get_resource_info())
|
||||||
print("Latest game version: {}".format(res_info.game.latest.version))
|
print("Latest game version: {}".format(res_info.game.latest.version))
|
||||||
if not self._ask("Do you want to install the game?"):
|
if not self._ask("Do you want to install the game?"):
|
||||||
print("Aborting game installation process.")
|
print("Aborting game installation process.")
|
||||||
return
|
return
|
||||||
print("Downloading full game (This will take a long time)...")
|
self.download_game()
|
||||||
asyncio.run(self._installer.download_full_game(forced))
|
|
||||||
print("Installing game...")
|
print("Installing game...")
|
||||||
self._install_from_archive(self._installer.temp_path.joinpath(res_info.game.latest.name))
|
self._install_from_archive(self._installer.temp_path.joinpath(res_info.game.latest.name), forced)
|
||||||
|
|
||||||
def install_voiceover(self, languages: str):
|
def install_voiceover(self, languages: str):
|
||||||
res_info = asyncio.run(self._launcher.get_resource_info())
|
res_info = asyncio.run(self._launcher.get_resource_info())
|
||||||
@ -188,8 +216,16 @@ def main():
|
|||||||
help="Patch the game (if not already patched, else do nothing)")
|
help="Patch the game (if not already patched, else do nothing)")
|
||||||
parser.add_argument("--login-fix", action="store_true",
|
parser.add_argument("--login-fix", action="store_true",
|
||||||
help="Patch the game to fix login issues (if not already patched, else do nothing)")
|
help="Patch the game to fix login issues (if not already patched, else do nothing)")
|
||||||
parser.add_argument("-Sy", "--update", action="store", type=str,
|
parser.add_argument("-Sy", "--update", action="store", type=str, default="",
|
||||||
help="Update the game and specified voiceover pack only (or install if not found)")
|
help="Update the game and specified voiceover pack only (or install if not found)")
|
||||||
|
parser.add_argument("-Sw", "--download-game", action="store_true",
|
||||||
|
help="Download the full game to the temporary directory")
|
||||||
|
parser.add_argument("-Swv", "--download-voiceover", action="store", type=str,
|
||||||
|
help="Download the full voiceover to the temporary directory")
|
||||||
|
parser.add_argument("-Syw", "--download-game-update", action="store", type=str, default="",
|
||||||
|
help="Download the game and the voiceover update to the temporary directory")
|
||||||
|
parser.add_argument("-Sywv", "--download-voiceover-update", action="store", type=str,
|
||||||
|
help="Download the voiceover update to the temporary directory")
|
||||||
parser.add_argument("-Sv", "--update-voiceover", action="store", type=str,
|
parser.add_argument("-Sv", "--update-voiceover", action="store", type=str,
|
||||||
help="Update the voiceover pack only (or install if not found)")
|
help="Update the voiceover pack only (or install if not found)")
|
||||||
parser.add_argument("-Syu", "--update-all", action="store_true",
|
parser.add_argument("-Syu", "--update-all", action="store_true",
|
||||||
@ -199,12 +235,15 @@ def main():
|
|||||||
parser.add_argument("-Rv", "--remove-voiceover", action="store_true", help="Remove a Voiceover pack (if installed)")
|
parser.add_argument("-Rv", "--remove-voiceover", action="store_true", help="Remove a Voiceover pack (if installed)")
|
||||||
parser.add_argument("--get-game-version", action="store_true", help="Get the current game version")
|
parser.add_argument("--get-game-version", action="store_true", help="Get the current game version")
|
||||||
parser.add_argument("--no-overseas", action="store_true", help="Don't use overseas server")
|
parser.add_argument("--no-overseas", action="store_true", help="Don't use overseas server")
|
||||||
|
parser.add_argument("--from-ver", action="store", help="Override the detected game version", type=str, default=None)
|
||||||
parser.add_argument("--noconfirm", action="store_true",
|
parser.add_argument("--noconfirm", action="store_true",
|
||||||
help="Do not ask any for confirmation. (Ignored in interactive mode)")
|
help="Do not ask any for confirmation. (Ignored in interactive mode)")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
interactive_mode = not args.install and not args.install_from_file and not args.patch and not args.update and not \
|
interactive_mode = not args.install and not args.install_from_file and not args.patch and not args.update and not \
|
||||||
args.remove and not args.remove_patch and not args.remove_voiceover and not args.get_game_version and not \
|
args.remove and not args.remove_patch and not args.remove_voiceover and not args.get_game_version and not \
|
||||||
args.install_voiceover_from_file and not args.update_voiceover
|
args.install_voiceover_from_file and not args.update_voiceover and not args.download_game and not \
|
||||||
|
args.download_voiceover and not args.download_game_update and not args.download_voiceover_update and not \
|
||||||
|
args.install_voiceover_from_file and not args.update_all and not args.login_fix
|
||||||
if args.temporary_dir:
|
if args.temporary_dir:
|
||||||
args.temporary_dir.mkdir(parents=True, exist_ok=True)
|
args.temporary_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
@ -225,6 +264,18 @@ def main():
|
|||||||
if args.get_game_version:
|
if args.get_game_version:
|
||||||
ui.get_game_version()
|
ui.get_game_version()
|
||||||
|
|
||||||
|
if args.download_game:
|
||||||
|
ui.download_game()
|
||||||
|
|
||||||
|
if args.download_voiceover:
|
||||||
|
ui.download_voiceover(args.download_voiceover)
|
||||||
|
|
||||||
|
if args.download_game_update:
|
||||||
|
ui.download_game_update()
|
||||||
|
|
||||||
|
if args.download_voiceover_update:
|
||||||
|
ui.download_voiceover_update(args.download_voiceover_update)
|
||||||
|
|
||||||
if args.install:
|
if args.install:
|
||||||
ui.install_game()
|
ui.install_game()
|
||||||
|
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
|
|
||||||
import xdelta3
|
|
||||||
import tarfile
|
import tarfile
|
||||||
import appdirs
|
import appdirs
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@ -12,6 +10,12 @@ from worthless import constants
|
|||||||
from worthless.launcher import Launcher
|
from worthless.launcher import Launcher
|
||||||
from worthless.installer import Installer
|
from worthless.installer import Installer
|
||||||
|
|
||||||
|
NO_XDELTA3_MODULE = False
|
||||||
|
try:
|
||||||
|
import xdelta3
|
||||||
|
except ImportError:
|
||||||
|
NO_XDELTA3_MODULE = True
|
||||||
|
|
||||||
|
|
||||||
class Patcher:
|
class Patcher:
|
||||||
def __init__(self, gamedir=Path.cwd(), data_dir: str | Path = None, patch_url: str = None, overseas=True):
|
def __init__(self, gamedir=Path.cwd(), data_dir: str | Path = None, patch_url: str = None, overseas=True):
|
||||||
@ -147,7 +151,7 @@ class Patcher:
|
|||||||
f.write(patched_xlua_bytes)
|
f.write(patched_xlua_bytes)
|
||||||
|
|
||||||
def apply_xlua_patch(self, fallback=True):
|
def apply_xlua_patch(self, fallback=True):
|
||||||
if fallback:
|
if NO_XDELTA3_MODULE or fallback:
|
||||||
asyncio.run(self._patch_xlua_fallback())
|
asyncio.run(self._patch_xlua_fallback())
|
||||||
return
|
return
|
||||||
self._patch_xlua()
|
self._patch_xlua()
|
||||||
@ -161,7 +165,7 @@ class Patcher:
|
|||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
# Patch UnityPlayer.dll
|
# Patch UnityPlayer.dll
|
||||||
if fallback:
|
if NO_XDELTA3_MODULE or fallback:
|
||||||
asyncio.run(self._patch_unityplayer_fallback())
|
asyncio.run(self._patch_unityplayer_fallback())
|
||||||
else:
|
else:
|
||||||
self._patch_unityplayer()
|
self._patch_unityplayer()
|
||||||
|
Loading…
Reference in New Issue
Block a user