diff --git a/offline-minecraft-launcher.py b/offline-minecraft-launcher.py index 6d1727e..4949d03 100644 --- a/offline-minecraft-launcher.py +++ b/offline-minecraft-launcher.py @@ -1,8 +1,14 @@ #!/usr/bin/env python3 import sys +mainScript = "" oldexcepthook = sys.excepthook def newexcepthook(type,value,traceback): + try: + with open(p(omlPath,"error-mainScript.py"),"w",encoding="utf-8") as ms: + ms.write(mainScript) + except: + pass oldexcepthook(type,value,traceback) input("Press ENTER to quit.") sys.excepthook = newexcepthook @@ -82,244 +88,16 @@ def main(): break print("") - print(colored(colorama.Fore.GREEN,"Reading config...")) - config = configparser.ConfigParser() - config.optionxform = str - config.read(p(omlPath,"config.ini")) - - global lv - - lv = config["default"] - for var in lv: - glbs = globals() - for glb in glbs: - lv[var] = lv[var].replace("$+" +glb+ "$",str(glbs[glb])) - - lcs = locals() - for lc in lcs: - lv[var] = lv[var].replace("$" +lc+ "$",str(lcs[lc])) - - if lv["osName"] == "": - lv["osName"] = platform.system().lower() - if lv["osName"] == "darwin": lv["osName"] = "macos" - - if lv["osVersion"] == "": - lv["osVersion"] = platform.version() - - if lv["jvmArch"] == "": - print(colored(colorama.Fore.GREEN,"Querying JVM architecture...")) - if "64-Bit" in subprocess.check_output([lv["java"],"-version"]).decode("utf-8"): - lv["jvmArch"] = "amd64" - else: - lv["jvmArch"] = "x86" - + print(colored(colorama.Fore.GREEN,"Creating main-script from stages...")) + global mainScript + mainScript = "" + for stage in readGenericListFile(p(omlPath,"stages","stages.txt")): + mainScript += "# --- STAGE: " +stage + "\r\n" + with open(p(omlPath,"stages",stage),"r",encoding="utf-8") as sf: + mainScript += sf.read() + mainScript += "\r\n\r\n" print("") - for setting in lv: - print(colored(colorama.Fore.BLACK,setting+ "=" +str(lv[setting]))) - if len(sys.argv) > 1: - for arg in sys.argv[1:]: - if arg.startswith("-"): continue - argSplit = arg.split("=",1) - if len(argSplit) > 1: - lv[argSplit[0]] = argSplit[1] - else: - lv[argSplit[0]] = True - - if not lv["osName"] in ["windows","linux","macos"]: - print(colored(colorama.Fore.YELLOW,"\nWarning, unsupported OS detected: '" +lv["osName"]+ "'"),file=sys.stderr) - print("Needs to be either windows, linux or macos. Define it with osName=name in the config.",file=sys.stderr) - - print("") - if not "version" in lv: lv["version"] = input("Version ID: ") - if "-downloadonly" in sys.argv: lv["name"] = "Player" - if not "name" in lv: lv["name"] = input("Player name: ") - global tmpFile - tmpFile = p(lv["gamePath"],"file.tmp") - if os.path.isfile(tmpFile): os.remove(tmpFile) - - launcherVariables = {} - versionsPath = p(lv["gamePath"],"versions") - libraryPath = p(lv["gamePath"],"libraries") - nativePath = p(lv["gamePath"],"natives") - versionPath = p(lv["gamePath"],"versions",lv["version"]) - nativesOutPath = p(lv["gamePath"],"natives-extracted",lv["version"],lv["osName"]+ "." +lv["jvmArch"]) - assetsPath = p(lv["gamePath"],"assets") - - print(colored(colorama.Fore.GREEN,"Scanning .json(s)...")) - clientJson,libraries,arguments,jvmArguments = processVersion(versionsPath,libraryPath,nativePath,lv["version"]) - - try: - launcherVariables["assets_index_name"] = findInChain(versionsPath,lv["version"],["assets"]) - except: - print(colored(colorama.Fore.YELLOW,"> Could not find assets_index_name, assuming pre-1.6"),file=sys.stderr) - launcherVariables["assets_index_name"] = "pre-1.6" - input() - - print(colored(colorama.Fore.GREEN,"\nDownloading libraries...")) - for library in libraries: - if "url" in library: - print(colored(colorama.Fore.BLACK,getLibraryPrettyName(library))) - try: - fileDl(library["url"],library["filePathOS"],read = False) - except Exception as e: - print(colored(colorama.Fore.RED,"> Could not download: ") +str(e),file=sys.stderr) - else: - if library["dumb"] == True: - try: - fileDl(library["url"] + ".sha1",library["filePathOS"] + ".sha1",read = False) - except Exception as e: - print(colored(colorama.Fore.RED,"> Could not download sha1 hash: ") +str(e),file=sys.stderr) - - if "-verifydata" in sys.argv: checkLibraryHash(library) - - if "-verifydata" in sys.argv: # assets - print(colored(colorama.Fore.GREEN,"\nVerifying assets...")) - assetJson = False - with open(p(assetsPath,"indexes",launcherVariables["assets_index_name"] + ".json"),"r") as fileh: assetJson = json.loads(fileh.read()) - - for asset in assetJson["objects"]: - hash = assetJson["objects"][asset]["hash"] - assetp = p(assetsPath,"objects",hash[:2],hash) - if not os.path.isfile(assetp): - print(colored(colorama.Fore.RED,assetp+ " is missing!"),file=sys.stderr) - continue - if hash != getFileHash(assetp): - print(colored(colorama.Fore.RED,assetp+ " is corrupt!"),file=sys.stderr) - - if "-downloadonly" in sys.argv: - exit(0) - - loadLibraries = {} - for library in libraries: - if "data" in library and "rules" in library["data"] and checkRules(library["data"]["rules"]) == "disallow": continue - if library["type"] == "client": - loadLibraries["client:" +library["filePathOS"]] = library - elif library["type"] == "library": - loadLibraries[library["package"] + ":" +library["name"]] = library - - separator = ";" - libraryList = "" - if lv["osName"] != "windows": separator = ":" - print(colored(colorama.Fore.GREEN,"\nLoaded libraries:")) - clientJar = "" - for libraryID in loadLibraries: - library = loadLibraries[libraryID] - if os.path.isfile(library["filePathOS"]): - if library["type"] == "client": - print("Client: " +library["filePathOS"]) - clientJar = library["filePathOS"] - else: - print(colored(colorama.Fore.BLACK,getLibraryPrettyName(library))) - else: - print(colored(colorama.Fore.RED,"> Lib not found: ") +getLibraryPrettyName(library),file=sys.stderr) - continue - - libraryList += library["filePathOS"] + separator - libraryList = libraryList[:-1] - - print(colored(colorama.Fore.GREEN,"\nExtracting natives...")) - if not os.path.isdir(nativesOutPath): os.makedirs(nativesOutPath) - for library in libraries: - if library["type"] == "native": - if "rules" in library["data"] and checkRules(library["data"]["rules"]) == "disallow": continue - if lv["osName"] != "macos": - if library["nativeOS"] != lv["osName"]: continue - else: - if not library["nativeOS"] in ["macos","osx"]: continue - - if not os.path.isfile(library["filePathOS"]): - print(colored(colorama.Fore.RED,"> Native not found: ") +getLibraryPrettyName(library),file=sys.stderr) - continue - - print(colored(colorama.Fore.BLACK,getLibraryPrettyName(library))) - proc = subprocess.Popen(["7z","x",library["filePathOS"],"-o" +nativesOutPath,"-aos"],stdout=subprocess.DEVNULL) - rtn = proc.wait() - if rtn != 0: - print(colored(colorama.Fore.RED,"> Native could not be extracted: ") +getLibraryPrettyName(library),file=sys.stderr) - - print(colored(colorama.Fore.GREEN,"\nSetting up launcher variables...")) - launcherVariables["auth_player_name"] = lv["name"] - launcherVariables["version_name"] = findInChainDeepest(versionsPath,lv["version"],["id"]) - launcherVariables["game_directory"] = lv["gamePath"] - launcherVariables["assets_root"] = assetsPath - launcherVariables["auth_access_token"] = "-" - launcherVariables["auth_uuid"] = hashlib.md5(lv["name"].encode('utf-8')).hexdigest() - launcherVariables["user_type"] = "offline" - launcherVariables["version_type"] = clientJson["type"] - launcherVariables["natives_directory"] = nativesOutPath - launcherVariables["launcher_name"] = "offline-minecraft-launcher" - launcherVariables["launcher_version"] = "0.0" - launcherVariables["classpath"] = libraryList - launcherVariables["game_assets"] = assetsPath - launcherVariables["auth_session"] = "-" - launcherVariables["user_properties"] = "{}" - - if lv["profileFolder"] == "1": - profilePath = p(lv["gamePath"],"profiles") - launcherVariables["game_directory"] = p(profilePath,lv["name"],lv["version"],".minecraft") - if not os.path.isdir(launcherVariables["game_directory"]): os.makedirs(launcherVariables["game_directory"]) - os.chdir(launcherVariables["game_directory"]) - - if launcherVariables["game_directory"].replace(pUp(launcherVariables["game_directory"]) + os.sep,"",1) == ".minecraft": - print(colored(colorama.Fore.MAGENTA,"> game_directory is called .minecraft, setting APPDATA/HOME environment variables to parent directory.")) - os.environ["APPDATA"] = pUp(launcherVariables["game_directory"]) - os.environ["HOME"] = os.environ["APPDATA"] - - # JVM arguments: - args = [] - - if not findArgument(jvmArguments,"-Djava-library.path="): - args.append("-Djava.library.path=" +nativesOutPath) - - if not findArgument(jvmArguments,"-Dminecraft.launcher.brand="): - args.append("-Dminecraft.launcher.brand=" +launcherVariables["launcher_name"]) - - if not findArgument(jvmArguments,"-Dminecraft.launcher.version="): - args.append("-Dminecraft.launcher.version=" +launcherVariables["launcher_version"]) - - if lv["osName"] == "windows": - if not findArgument(jvmArguments,"-XX:HeapDumpPath="): - args.append("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump") - - args.append("-Dminecraft.client.jar=" +clientJar) - - if not findArgument(jvmArguments,"-cp"): - args.append("-cp") - args.append(libraryList) - - for arg in jvmArguments: - for var in launcherVariables: - arg = arg.replace("${" +var+ "}",launcherVariables[var]) - args.append(arg) - args = args + json.loads(lv["jvmArguments"]) - args.append(clientJson["mainClass"]) - - for arg in arguments: - for var in launcherVariables: - arg = arg.replace("${" +var+ "}",launcherVariables[var]) - args.append(arg) - - if not findArgument(args,"--gameDir"): - args.append("--gameDir") - args.append(launcherVariables["game_directory"]) - - if not findArgument(args,"--assetsDir"): - args.append("--assetsDir") - args.append(launcherVariables["assets_root"]) - - print(colored(colorama.Fore.GREEN,"\nLaunching Minecraft...")) - if lv["console"] == "1": - proc = subprocess.Popen([lv["java"]] + args) - rtn = proc.wait() - if rtn != 0: print(colored(colorama.Fore.RED,"> Launch failed: ") +"return isn't 0",file=sys.stderr) - else: - pkwargs = { - "stdout": subprocess.DEVNULL, - "stdin": subprocess.DEVNULL, - "stderr": subprocess.DEVNULL - } - if lv["osName"] == "windows": pkwargs["creationflags"] = 0x00000008 - subprocess.Popen([lv["java"] + "w"] + args,**pkwargs) - + print(colored(colorama.Fore.GREEN,"Running main-script...")) + runCode(mainScript,False,"main-script") main() \ No newline at end of file diff --git a/oml/stages/assets-integrity.py b/oml/stages/assets-integrity.py new file mode 100644 index 0000000..3c1e2f2 --- /dev/null +++ b/oml/stages/assets-integrity.py @@ -0,0 +1,13 @@ +if "-verifydata" in sys.argv: # assets + print(colored(colorama.Fore.GREEN,"\nVerifying assets...")) + assetJson = False + with open(p(assetsPath,"indexes",launcherVariables["assets_index_name"] + ".json"),"r") as fileh: assetJson = json.loads(fileh.read()) + + for asset in assetJson["objects"]: + hash = assetJson["objects"][asset]["hash"] + assetp = p(assetsPath,"objects",hash[:2],hash) + if not os.path.isfile(assetp): + print(colored(colorama.Fore.RED,assetp+ " is missing!"),file=sys.stderr) + continue + if hash != getFileHash(assetp): + print(colored(colorama.Fore.RED,assetp+ " is corrupt!"),file=sys.stderr) \ No newline at end of file diff --git a/oml/stages/cleanup.py b/oml/stages/cleanup.py new file mode 100644 index 0000000..5a2e09c --- /dev/null +++ b/oml/stages/cleanup.py @@ -0,0 +1,3 @@ +global tmpFile +tmpFile = p(lv["gamePath"],"file.tmp") +if os.path.isfile(tmpFile): os.remove(tmpFile) \ No newline at end of file diff --git a/oml/stages/config.py b/oml/stages/config.py new file mode 100644 index 0000000..d34427e --- /dev/null +++ b/oml/stages/config.py @@ -0,0 +1,52 @@ +print(colored(colorama.Fore.GREEN,"Reading config...")) +config = configparser.ConfigParser() +config.optionxform = str +config.read(p(omlPath,"config.ini")) + +global lv + +lv = config["default"] +for var in lv: + glbs = globals().copy() + for glb in glbs: + lv[var] = lv[var].replace("$+" +glb+ "$",str(glbs[glb])) + + lcs = locals().copy() + for lc in lcs: + lv[var] = lv[var].replace("$" +lc+ "$",str(lcs[lc])) + +if lv["osName"] == "": + lv["osName"] = platform.system().lower() + if lv["osName"] == "darwin": lv["osName"] = "macos" + +if lv["osVersion"] == "": + lv["osVersion"] = platform.version() + +if lv["jvmArch"] == "": + print(colored(colorama.Fore.GREEN,"Querying JVM architecture...")) + if "64-Bit" in subprocess.check_output([lv["java"],"-version"]).decode("utf-8"): + lv["jvmArch"] = "amd64" + else: + lv["jvmArch"] = "x86" + +print("") +for setting in lv: + print(colored(colorama.Fore.BLACK,setting+ "=" +str(lv[setting]))) + +if len(sys.argv) > 1: + for arg in sys.argv[1:]: + if arg.startswith("-"): continue + argSplit = arg.split("=",1) + if len(argSplit) > 1: + lv[argSplit[0]] = argSplit[1] + else: + lv[argSplit[0]] = True + +if not lv["osName"] in ["windows","linux","macos"]: + print(colored(colorama.Fore.YELLOW,"\nWarning, unsupported OS detected: '" +lv["osName"]+ "'"),file=sys.stderr) + print("Needs to be either windows, linux or macos. Define it with osName=name in the config.",file=sys.stderr) + +print("") +if not "version" in lv: lv["version"] = input("Version ID: ") +if "-downloadonly" in sys.argv: lv["name"] = "Player" +if not "name" in lv: lv["name"] = input("Player name: ") \ No newline at end of file diff --git a/oml/stages/downloadonly-quit.py b/oml/stages/downloadonly-quit.py new file mode 100644 index 0000000..5fe5557 --- /dev/null +++ b/oml/stages/downloadonly-quit.py @@ -0,0 +1,2 @@ +if "-downloadonly" in sys.argv: + exit(0) \ No newline at end of file diff --git a/oml/stages/launch.py b/oml/stages/launch.py new file mode 100644 index 0000000..ba7c48c --- /dev/null +++ b/oml/stages/launch.py @@ -0,0 +1,13 @@ +print(colored(colorama.Fore.GREEN,"\nLaunching Minecraft...")) +if lv["console"] == "1": + proc = subprocess.Popen([lv["java"]] + args) + rtn = proc.wait() + if rtn != 0: print(colored(colorama.Fore.RED,"> Launch failed: ") +"return isn't 0",file=sys.stderr) +else: + pkwargs = { + "stdout": subprocess.DEVNULL, + "stdin": subprocess.DEVNULL, + "stderr": subprocess.DEVNULL + } + if lv["osName"] == "windows": pkwargs["creationflags"] = 0x00000008 + subprocess.Popen([lv["java"] + "w"] + args,**pkwargs) \ No newline at end of file diff --git a/oml/stages/launcher-variables.py b/oml/stages/launcher-variables.py new file mode 100644 index 0000000..c9da4d3 --- /dev/null +++ b/oml/stages/launcher-variables.py @@ -0,0 +1,69 @@ +print(colored(colorama.Fore.GREEN,"\nSetting up launcher variables...")) +launcherVariables["auth_player_name"] = lv["name"] +launcherVariables["version_name"] = findInChainDeepest(versionsPath,lv["version"],["id"]) +launcherVariables["game_directory"] = lv["gamePath"] +launcherVariables["assets_root"] = assetsPath +launcherVariables["auth_access_token"] = "-" +launcherVariables["auth_uuid"] = hashlib.md5(lv["name"].encode('utf-8')).hexdigest() +launcherVariables["user_type"] = "offline" +launcherVariables["version_type"] = clientJson["type"] +launcherVariables["natives_directory"] = nativesOutPath +launcherVariables["launcher_name"] = "offline-minecraft-launcher" +launcherVariables["launcher_version"] = "0.0" +launcherVariables["classpath"] = libraryList +launcherVariables["game_assets"] = assetsPath +launcherVariables["auth_session"] = "-" +launcherVariables["user_properties"] = "{}" + +if lv["profileFolder"] == "1": + profilePath = p(lv["gamePath"],"profiles") + launcherVariables["game_directory"] = p(profilePath,lv["name"],lv["version"],".minecraft") + if not os.path.isdir(launcherVariables["game_directory"]): os.makedirs(launcherVariables["game_directory"]) + os.chdir(launcherVariables["game_directory"]) + +if launcherVariables["game_directory"].replace(pUp(launcherVariables["game_directory"]) + os.sep,"",1) == ".minecraft": + print(colored(colorama.Fore.MAGENTA,"> game_directory is called .minecraft, setting APPDATA/HOME environment variables to parent directory.")) + os.environ["APPDATA"] = pUp(launcherVariables["game_directory"]) + os.environ["HOME"] = os.environ["APPDATA"] + +# JVM arguments: +args = [] + +if not findArgument(jvmArguments,"-Djava-library.path="): + args.append("-Djava.library.path=" +nativesOutPath) + +if not findArgument(jvmArguments,"-Dminecraft.launcher.brand="): + args.append("-Dminecraft.launcher.brand=" +launcherVariables["launcher_name"]) + +if not findArgument(jvmArguments,"-Dminecraft.launcher.version="): + args.append("-Dminecraft.launcher.version=" +launcherVariables["launcher_version"]) + +if lv["osName"] == "windows": + if not findArgument(jvmArguments,"-XX:HeapDumpPath="): + args.append("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump") + +args.append("-Dminecraft.client.jar=" +clientJar) + +if not findArgument(jvmArguments,"-cp"): + args.append("-cp") + args.append(libraryList) + +for arg in jvmArguments: + for var in launcherVariables: + arg = arg.replace("${" +var+ "}",launcherVariables[var]) + args.append(arg) +args = args + json.loads(lv["jvmArguments"]) +args.append(clientJson["mainClass"]) + +for arg in arguments: + for var in launcherVariables: + arg = arg.replace("${" +var+ "}",launcherVariables[var]) + args.append(arg) + +if not findArgument(args,"--gameDir"): + args.append("--gameDir") + args.append(launcherVariables["game_directory"]) + +if not findArgument(args,"--assetsDir"): + args.append("--assetsDir") + args.append(launcherVariables["assets_root"]) \ No newline at end of file diff --git a/oml/stages/libraries-download.py b/oml/stages/libraries-download.py new file mode 100644 index 0000000..1321ed0 --- /dev/null +++ b/oml/stages/libraries-download.py @@ -0,0 +1,16 @@ +print(colored(colorama.Fore.GREEN,"\nDownloading libraries...")) +for library in libraries: + if "url" in library: + print(colored(colorama.Fore.BLACK,getLibraryPrettyName(library))) + try: + fileDl(library["url"],library["filePathOS"],read = False) + except Exception as e: + print(colored(colorama.Fore.RED,"> Could not download: ") +str(e),file=sys.stderr) + else: + if library["dumb"] == True: + try: + fileDl(library["url"] + ".sha1",library["filePathOS"] + ".sha1",read = False) + except Exception as e: + print(colored(colorama.Fore.RED,"> Could not download sha1 hash: ") +str(e),file=sys.stderr) + + if "-verifydata" in sys.argv: checkLibraryHash(library) \ No newline at end of file diff --git a/oml/stages/libraries-setup.py b/oml/stages/libraries-setup.py new file mode 100644 index 0000000..70907a5 --- /dev/null +++ b/oml/stages/libraries-setup.py @@ -0,0 +1,27 @@ +loadLibraries = {} +for library in libraries: + if "data" in library and "rules" in library["data"] and checkRules(library["data"]["rules"]) == "disallow": continue + if library["type"] == "client": + loadLibraries["client:" +library["filePathOS"]] = library + elif library["type"] == "library": + loadLibraries[library["package"] + ":" +library["name"]] = library + +separator = ";" +libraryList = "" +if lv["osName"] != "windows": separator = ":" +print(colored(colorama.Fore.GREEN,"\nLoaded libraries:")) +clientJar = "" +for libraryID in loadLibraries: + library = loadLibraries[libraryID] + if os.path.isfile(library["filePathOS"]): + if library["type"] == "client": + print("Client: " +library["filePathOS"]) + clientJar = library["filePathOS"] + else: + print(colored(colorama.Fore.BLACK,getLibraryPrettyName(library))) + else: + print(colored(colorama.Fore.RED,"> Lib not found: ") +getLibraryPrettyName(library),file=sys.stderr) + continue + + libraryList += library["filePathOS"] + separator +libraryList = libraryList[:-1] \ No newline at end of file diff --git a/oml/stages/natives-extract.py b/oml/stages/natives-extract.py new file mode 100644 index 0000000..b2926bf --- /dev/null +++ b/oml/stages/natives-extract.py @@ -0,0 +1,19 @@ +print(colored(colorama.Fore.GREEN,"\nExtracting natives...")) +if not os.path.isdir(nativesOutPath): os.makedirs(nativesOutPath) +for library in libraries: + if library["type"] == "native": + if "rules" in library["data"] and checkRules(library["data"]["rules"]) == "disallow": continue + if lv["osName"] != "macos": + if library["nativeOS"] != lv["osName"]: continue + else: + if not library["nativeOS"] in ["macos","osx"]: continue + + if not os.path.isfile(library["filePathOS"]): + print(colored(colorama.Fore.RED,"> Native not found: ") +getLibraryPrettyName(library),file=sys.stderr) + continue + + print(colored(colorama.Fore.BLACK,getLibraryPrettyName(library))) + proc = subprocess.Popen(["7z","x",library["filePathOS"],"-o" +nativesOutPath,"-aos"],stdout=subprocess.DEVNULL) + rtn = proc.wait() + if rtn != 0: + print(colored(colorama.Fore.RED,"> Native could not be extracted: ") +getLibraryPrettyName(library),file=sys.stderr) \ No newline at end of file diff --git a/oml/stages/path-setup.py b/oml/stages/path-setup.py new file mode 100644 index 0000000..ddd1dfa --- /dev/null +++ b/oml/stages/path-setup.py @@ -0,0 +1,6 @@ +versionsPath = p(lv["gamePath"],"versions") +libraryPath = p(lv["gamePath"],"libraries") +nativePath = p(lv["gamePath"],"natives") +versionPath = p(lv["gamePath"],"versions",lv["version"]) +nativesOutPath = p(lv["gamePath"],"natives-extracted",lv["version"],lv["osName"]+ "." +lv["jvmArch"]) +assetsPath = p(lv["gamePath"],"assets") \ No newline at end of file diff --git a/oml/stages/stages.txt b/oml/stages/stages.txt new file mode 100644 index 0000000..e2a618e --- /dev/null +++ b/oml/stages/stages.txt @@ -0,0 +1,11 @@ +config.py +cleanup.py +path-setup.py +version-scan.py +libraries-download.py +assets-integrity.py +downloadonly-quit.py +libraries-setup.py +natives-extract.py +launcher-variables.py +launch.py \ No newline at end of file diff --git a/oml/stages/version-scan.py b/oml/stages/version-scan.py new file mode 100644 index 0000000..041daae --- /dev/null +++ b/oml/stages/version-scan.py @@ -0,0 +1,10 @@ +print(colored(colorama.Fore.GREEN,"Scanning .json(s)...")) +clientJson,libraries,arguments,jvmArguments = processVersion(versionsPath,libraryPath,nativePath,lv["version"]) + +launcherVariables = {} +try: + launcherVariables["assets_index_name"] = findInChain(versionsPath,lv["version"],["assets"]) +except: + print(colored(colorama.Fore.YELLOW,"> Could not find assets_index_name, assuming pre-1.6"),file=sys.stderr) + launcherVariables["assets_index_name"] = "pre-1.6" + input() \ No newline at end of file