From 9248963275676918881ba8188878e756eeb1c92e Mon Sep 17 00:00:00 2001 From: Fierelier Date: Mon, 29 Mar 2021 09:33:20 +0200 Subject: [PATCH] Don't load multiple of the same library (fixes Forge) --- offline-minecraft-launcher.py | 100 ++++++++++++++++++++-------------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/offline-minecraft-launcher.py b/offline-minecraft-launcher.py index d9754c5..141a4ad 100644 --- a/offline-minecraft-launcher.py +++ b/offline-minecraft-launcher.py @@ -105,33 +105,45 @@ def findInChainDeepest(versionsPath,version,path): if found == False: raise return found +def parseJavaLibraryName(libName): + libSplit = libName.rsplit(":",1) + libVersion = libSplit[1] + libPath = libSplit[0] + libName = libSplit[0].rsplit(":",1)[1] + libFilePath = libSplit[0].replace(".","/").replace(":","/") + "/" + libVersion + "/" +libName+ "-" +libVersion+ ".jar" + return libPath,libName,libVersion,libFilePath + def processVersion(versionsPath,libraryPath,nativePath,version): versionPath = p(versionsPath,version) clientJson = readJsonFile(p(versionPath,version + ".json")) libraries = [] - natives = [] arguments = [] - downloadLibraries = {} if "inheritsFrom" in clientJson: - _,libraries,downloadLibraries,natives,arguments = processVersion(versionsPath,libraryPath,nativePath,clientJson["inheritsFrom"]) + _,libraries,arguments = processVersion(versionsPath,libraryPath,nativePath,clientJson["inheritsFrom"]) for library in clientJson["libraries"]: + l = {} + l["path"],l["name"],l["version"],l["filePath"] = parseJavaLibraryName(library["name"]) + l["type"] = "library" + if "downloads" in library: # Libraries if "artifact" in library["downloads"]: - library["downloads"]["artifact"]["path"] = library["downloads"]["artifact"]["path"].replace("/",os.path.sep) - libraries.append(p(libraryPath,library["downloads"]["artifact"]["path"])) + if "path" in library["downloads"]["artifact"]: + l["filePathOS"] = p(libraryPath,library["downloads"]["artifact"]["path"].replace("/",os.path.sep)) if "url" in library["downloads"]["artifact"] and library["downloads"]["artifact"]["url"] != "": - downloadLibraries[p(libraryPath,library["downloads"]["artifact"]["path"])] = library["downloads"]["artifact"]["url"] + l["url"] = library["downloads"]["artifact"]["url"] + libraries.append(l) # Natives if "classifiers" in library["downloads"]: + l["type"] = "native" for classifier in library["downloads"]["classifiers"]: native = library["downloads"]["classifiers"][classifier] - native["path"] = native["path"].replace("/",os.path.sep) + l["filePathOS"] = p(nativePath,native["path"].replace("/",os.path.sep)) if "url" in native and native["url"] != "": - downloadLibraries[p(nativePath,native["path"])] = native["url"] + l["url"] = native["url"] native = False if "natives-" +lv["osName"] in library["downloads"]["classifiers"]: @@ -139,25 +151,18 @@ def processVersion(versionsPath,libraryPath,nativePath,version): if lv["osName"] == "macos" and native == False and "natives-osx" in library["downloads"]["classifiers"]: native = library["downloads"]["classifiers"]["natives-osx"] - - if native != False: - natives.append(p(nativePath,native["path"])) elif "name" in library: - # Stupid libraries - libSplit = library["name"].rsplit(":",1) - libVersion = libSplit[1] - libName = libSplit[0].rsplit(":",1)[1] - libPath = libSplit[0].replace(".","/").replace(":","/") + "/" + libVersion + "/" +libName+ "-" +libVersion+ ".jar" - library["path"] = libPath.replace("/",os.path.sep) - libraries.append(p(libraryPath,library["path"])) - + # Dumb libraries if "url" in library: - fullUrl = library["url"] - while len(fullUrl) > 0 and fullUrl[-1] == "/": fullUrl = fullUrl[:-1] - fullUrl = fullUrl + "/" + libPath - downloadLibraries[p(libraryPath,library["path"])] = fullUrl + l["url"] = library["url"] + while len(l["url"]) > 0 and l["url"][-1] == "/": l["url"] = l["url"][:-1] + fullUrl = fullUrl + "/" + l["filePath"] + + l["filePathOS"] = p(libraryPath,l["path"].replace("/",os.path.sep)) + libraries.append(l) - if os.path.isfile(p(versionPath,version + ".jar")): libraries.append(p(versionPath,version + ".jar")) + if os.path.isfile(p(versionPath,version + ".jar")): + libraries.append({"type":"client","filePathOS":p(versionPath,version + ".jar")}) if "arguments" in clientJson: for arg in clientJson["arguments"]["game"]: @@ -169,7 +174,7 @@ def processVersion(versionsPath,libraryPath,nativePath,version): if type(arg) != str: continue arguments.append(arg) - return clientJson,libraries,downloadLibraries,natives,arguments + return clientJson,libraries,arguments def main(): print("Reading config...") @@ -215,31 +220,46 @@ def main(): versionsPath = p(lv["gamePath"],"versions") libraryPath = p(lv["gamePath"],"libraries") nativePath = p(lv["gamePath"],"natives") - clientJson,libraries,downloadLibraries,natives,arguments = processVersion(versionsPath,libraryPath,nativePath,lv["version"]) + clientJson,libraries,arguments = processVersion(versionsPath,libraryPath,nativePath,lv["version"]) versionPath = p(lv["gamePath"],"versions",lv["version"]) nativesOutPath = p(versionPath,"natives-" +lv["osName"]) assetsPath = p(lv["gamePath"],"assets") - separator = ";" - if lv["osName"] != "windows": separator = ":" - libraryList = separator.join(libraries) - - print("\nLibraries:") - for library in libraries: - print("- " +library) - print("\nDownloading libraries...") - for library in downloadLibraries: - fileDl(downloadLibraries[library],library,read = False) - for library in libraries: - if not os.path.isfile(library): print("Warning, missing lib: " +library) + if "url" in library: + fileDl(library["url"],library["filePathOS"],read = False) + + loadLibraries = {} + for library in libraries: + if library["type"] == "client": + loadLibraries["client:" +library["filePathOS"]] = library + elif library["type"] == "library": + loadLibraries[library["path"]] = library + + separator = ";" + libraryList = "" + if lv["osName"] != "windows": separator = ":" + print("\nLibraries/natives:") + for libraryID in loadLibraries: + library = loadLibraries[libraryID] + if os.path.isfile(library["filePathOS"]): + if library["type"] == "client": + print("Client: " +library["filePathOS"]) + else: + print("- " +library["path"]) + else: + print("Lib not found: " +library["path"]) + + libraryList += library["filePathOS"] + separator + libraryList = libraryList[:-1] print("\nExtracting natives...") if not os.path.isdir(nativesOutPath): os.makedirs(nativesOutPath) - for native in natives: - subprocess.run(["7z","x",native,"-o" +nativesOutPath,"-aos"],check=True,stdout=subprocess.DEVNULL) + for library in libraries: + if library["type"] == "native": + subprocess.run(["7z","x",library["filePathOS"],"-o" +nativesOutPath,"-aos"],check=True,stdout=subprocess.DEVNULL) launcherVariables = {} launcherVariables["auth_player_name"] = lv["name"]