2021-03-27 23:10:28 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
|
|
|
|
|
|
oldexcepthook = sys.excepthook
|
|
|
|
def newexcepthook(type,value,traceback):
|
|
|
|
oldexcepthook(type,value,traceback)
|
|
|
|
input("Press ENTER to quit.")
|
|
|
|
sys.excepthook = newexcepthook
|
|
|
|
|
|
|
|
import os
|
|
|
|
p = os.path.join
|
|
|
|
pUp = os.path.dirname
|
|
|
|
s = False
|
|
|
|
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
|
|
|
|
s = os.path.realpath(sys.executable)
|
|
|
|
else:
|
|
|
|
s = os.path.realpath(__file__)
|
|
|
|
sp = pUp(s)
|
|
|
|
|
2021-03-28 00:38:06 +00:00
|
|
|
import configparser
|
2021-03-27 23:10:28 +00:00
|
|
|
import subprocess
|
|
|
|
import json
|
|
|
|
import hashlib
|
|
|
|
import platform
|
2021-03-29 02:16:23 +00:00
|
|
|
import urllib.request
|
2021-03-29 23:19:22 +00:00
|
|
|
import re
|
2021-03-29 02:16:23 +00:00
|
|
|
|
|
|
|
def download(url,decode = "utf-8"):
|
|
|
|
request = urllib.request.Request(url,headers={"User-Agent":"Mozilla/5.0"})
|
|
|
|
response = urllib.request.urlopen(request)
|
|
|
|
rt = response.read()
|
|
|
|
if decode == False: return rt
|
|
|
|
return response.read().decode(decode)
|
|
|
|
|
|
|
|
def readFile(file,decode = "utf-8"):
|
|
|
|
fileh = False
|
|
|
|
fileh = open(file,"rb")
|
|
|
|
data = fileh.read()
|
|
|
|
fileh.close()
|
|
|
|
if decode == False: return data
|
|
|
|
return data.decode(decode)
|
|
|
|
|
|
|
|
def fileDl(url,file,read = True,decode = "utf-8"):
|
|
|
|
if os.path.isfile(file):
|
|
|
|
if read == True:
|
|
|
|
return readFile(file,decode)
|
|
|
|
return
|
|
|
|
|
|
|
|
print(url)
|
|
|
|
data = download(url,False)
|
|
|
|
fileh = open(tmpFile,"wb")
|
|
|
|
fileh.write(data)
|
|
|
|
fileh.close()
|
|
|
|
if pUp(file) != "" and not os.path.isdir(pUp(file)): os.makedirs(pUp(file))
|
|
|
|
os.rename(tmpFile,file)
|
|
|
|
if read == False: return
|
|
|
|
if decode == False: return data
|
|
|
|
return data.decode(decode)
|
2021-03-27 23:10:28 +00:00
|
|
|
|
|
|
|
def readJsonFile(file):
|
|
|
|
fileh = open(file,"r")
|
|
|
|
data = fileh.read()
|
|
|
|
fileh.close()
|
|
|
|
return json.loads(data)
|
|
|
|
|
2021-06-17 10:59:00 +00:00
|
|
|
def findArgument(args,searchFor):
|
|
|
|
for arg in args:
|
|
|
|
if arg.startswith(searchFor): return True
|
|
|
|
return False
|
|
|
|
|
2021-03-29 02:16:23 +00:00
|
|
|
def findInChain(versionsPath,version,path):
|
|
|
|
versionPath = p(versionsPath,version)
|
|
|
|
clientJson = readJsonFile(p(versionPath,version + ".json"))
|
|
|
|
curPath = clientJson.copy()
|
|
|
|
success = True
|
|
|
|
for dir in path:
|
|
|
|
if dir in curPath:
|
|
|
|
curPath = curPath[dir]
|
|
|
|
else:
|
|
|
|
success = False
|
|
|
|
break
|
|
|
|
|
|
|
|
if success == False:
|
|
|
|
return findInChain(versionsPath,clientJson["inheritsFrom"],path)
|
|
|
|
return curPath
|
|
|
|
|
|
|
|
def findInChainDeepest(versionsPath,version,path):
|
|
|
|
found = False
|
|
|
|
while True:
|
|
|
|
versionPath = p(versionsPath,version)
|
|
|
|
clientJson = readJsonFile(p(versionPath,version + ".json"))
|
|
|
|
curPath = clientJson.copy()
|
|
|
|
for dir in path:
|
|
|
|
if dir in curPath:
|
|
|
|
curPath = curPath[dir]
|
|
|
|
else:
|
|
|
|
if "inheritsFrom" in clientJson:
|
|
|
|
version = clientJson["inheritsFrom"]
|
|
|
|
continue
|
|
|
|
else:
|
|
|
|
curPath = False
|
|
|
|
break
|
|
|
|
|
|
|
|
found = curPath
|
|
|
|
if "inheritsFrom" in clientJson:
|
|
|
|
version = clientJson["inheritsFrom"]
|
|
|
|
continue
|
|
|
|
else:
|
|
|
|
break
|
|
|
|
|
|
|
|
if found == False: raise
|
|
|
|
return found
|
|
|
|
|
2021-03-29 07:33:20 +00:00
|
|
|
def parseJavaLibraryName(libName):
|
2021-06-17 10:54:58 +00:00
|
|
|
libSplit = libName.split(":",2)
|
|
|
|
libPackage = libSplit[0]
|
|
|
|
libName = libSplit[1]
|
|
|
|
libVersion = libSplit[2]
|
|
|
|
libFilePath = libPackage.replace(".","/") + "/" +libName+ "/" +libVersion+ "/" +libName+ "-" +libVersion+ ".jar"
|
|
|
|
return libPackage,libName,libVersion,libFilePath
|
2021-03-29 07:33:20 +00:00
|
|
|
|
2021-03-29 08:52:18 +00:00
|
|
|
def checkRules(ruleList):
|
|
|
|
action = "disallow"
|
|
|
|
for rule in ruleList:
|
|
|
|
if "os" in rule:
|
|
|
|
if "name" in rule["os"]:
|
2021-03-29 23:19:22 +00:00
|
|
|
rule["os"]["name"] = rule["os"]["name"].replace("osx","macos")
|
|
|
|
if not re.search(rule["os"]["name"],lv["osName"]): continue
|
2021-03-29 08:52:18 +00:00
|
|
|
|
2021-03-29 08:54:57 +00:00
|
|
|
if "arch" in rule["os"]:
|
2021-03-29 23:19:22 +00:00
|
|
|
if not re.search(rule["os"]["arch"],lv["jvmArch"]): continue
|
2021-03-29 08:52:18 +00:00
|
|
|
|
2021-03-29 23:19:41 +00:00
|
|
|
if "version" in rule["os"]:
|
|
|
|
if not re.search(rule["os"]["version"],lv["osVersion"]): continue
|
2021-03-29 10:20:57 +00:00
|
|
|
|
2021-03-29 08:52:18 +00:00
|
|
|
action = rule["action"]
|
2021-06-16 12:44:23 +00:00
|
|
|
else:
|
|
|
|
action = rule["action"]
|
2021-03-29 08:52:18 +00:00
|
|
|
|
|
|
|
return action
|
|
|
|
|
2021-03-29 02:16:23 +00:00
|
|
|
def processVersion(versionsPath,libraryPath,nativePath,version):
|
|
|
|
versionPath = p(versionsPath,version)
|
|
|
|
clientJson = readJsonFile(p(versionPath,version + ".json"))
|
|
|
|
libraries = []
|
|
|
|
arguments = []
|
2021-03-29 10:20:57 +00:00
|
|
|
jvmArguments = []
|
2021-03-29 02:16:23 +00:00
|
|
|
|
|
|
|
if "inheritsFrom" in clientJson:
|
2021-03-29 10:20:57 +00:00
|
|
|
_,libraries,arguments,jvmArguments = processVersion(versionsPath,libraryPath,nativePath,clientJson["inheritsFrom"])
|
2021-03-29 02:16:23 +00:00
|
|
|
|
|
|
|
for library in clientJson["libraries"]:
|
2021-03-29 07:33:20 +00:00
|
|
|
l = {}
|
2021-06-17 10:54:58 +00:00
|
|
|
l["package"],l["name"],l["version"],l["filePath"] = parseJavaLibraryName(library["name"])
|
2021-03-29 07:33:20 +00:00
|
|
|
l["type"] = "library"
|
2021-03-29 08:52:18 +00:00
|
|
|
l["data"] = library
|
2021-06-16 12:44:57 +00:00
|
|
|
l["dumb"] = True
|
2021-03-29 07:33:20 +00:00
|
|
|
|
2021-06-16 12:44:57 +00:00
|
|
|
# Dumb-detection
|
|
|
|
if "downloads" in library: l["dumb"] = False
|
|
|
|
|
|
|
|
# Type-detection
|
|
|
|
if not l["dumb"]:
|
2021-03-29 02:16:23 +00:00
|
|
|
if "classifiers" in library["downloads"]:
|
2021-03-29 07:33:20 +00:00
|
|
|
l["type"] = "native"
|
2021-06-16 12:44:57 +00:00
|
|
|
else:
|
|
|
|
if "natives" in library:
|
|
|
|
l["type"] = "native"
|
|
|
|
|
|
|
|
# Libraries
|
|
|
|
if l["type"] == "library":
|
|
|
|
if not l["dumb"]:
|
|
|
|
if "artifact" in library["downloads"]:
|
|
|
|
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"] != "":
|
|
|
|
l["url"] = library["downloads"]["artifact"]["url"]
|
|
|
|
libraries.append(l)
|
|
|
|
else:
|
|
|
|
if not "url" in library: library["url"] = "https://libraries.minecraft.net"
|
|
|
|
l["url"] = library["url"]
|
|
|
|
while len(l["url"]) > 0 and l["url"][-1] == "/": l["url"] = l["url"][:-1]
|
|
|
|
l["url"] = l["url"] + "/" + l["filePath"]
|
|
|
|
l["filePathOS"] = p(libraryPath,l["filePath"].replace("/",os.path.sep))
|
|
|
|
libraries.append(l)
|
|
|
|
|
|
|
|
# Natives
|
|
|
|
if l["type"] == "native":
|
|
|
|
if not l["dumb"]:
|
2021-03-29 05:51:39 +00:00
|
|
|
for classifier in library["downloads"]["classifiers"]:
|
|
|
|
native = library["downloads"]["classifiers"][classifier]
|
2021-06-16 13:41:19 +00:00
|
|
|
l["nativeOS"] = classifier.replace("natives-","",1)
|
2021-03-29 07:33:20 +00:00
|
|
|
l["filePathOS"] = p(nativePath,native["path"].replace("/",os.path.sep))
|
2021-03-29 05:51:39 +00:00
|
|
|
if "url" in native and native["url"] != "":
|
2021-03-29 07:33:20 +00:00
|
|
|
l["url"] = native["url"]
|
2021-03-29 10:20:57 +00:00
|
|
|
libraries.append(l)
|
2021-06-16 10:55:30 +00:00
|
|
|
else:
|
2021-06-16 12:44:57 +00:00
|
|
|
if not "url" in library: library["url"] = "https://libraries.minecraft.net"
|
|
|
|
l["url"] = library["url"]
|
|
|
|
while len(l["url"]) > 0 and l["url"][-1] == "/": l["url"] = l["url"][:-1]
|
|
|
|
l["url"] = l["url"] + "/" + l["filePath"]
|
|
|
|
|
|
|
|
lcopy = l.copy()
|
|
|
|
for native in library["natives"]:
|
|
|
|
l = lcopy.copy()
|
2021-06-16 13:41:19 +00:00
|
|
|
l["nativeOS"] = native
|
|
|
|
native = "natives-" + native
|
2021-06-16 12:44:57 +00:00
|
|
|
l["filePath"] = l["filePath"][:-4] + "-" + native + ".jar"
|
|
|
|
l["url"] = l["url"][:-4] + "-" + native + ".jar"
|
|
|
|
l["filePathOS"] = p(nativePath,l["filePath"].replace("/",os.path.sep))
|
|
|
|
libraries.append(l)
|
2021-03-29 02:16:23 +00:00
|
|
|
|
2021-03-29 07:33:20 +00:00
|
|
|
if os.path.isfile(p(versionPath,version + ".jar")):
|
|
|
|
libraries.append({"type":"client","filePathOS":p(versionPath,version + ".jar")})
|
2021-03-29 02:16:23 +00:00
|
|
|
|
|
|
|
if "arguments" in clientJson:
|
2021-03-29 10:20:57 +00:00
|
|
|
if "game" in clientJson["arguments"]:
|
|
|
|
for arg in clientJson["arguments"]["game"]:
|
|
|
|
if type(arg) != str: continue
|
|
|
|
arguments.append(arg)
|
|
|
|
if "jvm" in clientJson["arguments"]:
|
|
|
|
for arg in clientJson["arguments"]["jvm"]:
|
|
|
|
if type(arg) != str:
|
|
|
|
if "value" in arg:
|
|
|
|
if type(arg["value"]) != list:
|
|
|
|
arg["value"] = [arg["value"]]
|
|
|
|
|
|
|
|
if "rules" in arg:
|
|
|
|
if checkRules(arg["rules"]) == "allow":
|
|
|
|
for value in arg["value"]:
|
|
|
|
jvmArguments.append(value)
|
|
|
|
else:
|
|
|
|
for value in arg["value"]:
|
|
|
|
jvmArguments.append(value)
|
|
|
|
else:
|
|
|
|
jvmArguments.append(arg)
|
2021-03-29 02:16:23 +00:00
|
|
|
elif "minecraftArguments" in clientJson:
|
|
|
|
margs = clientJson["minecraftArguments"].replace('"',"").split(" ")
|
|
|
|
for arg in margs:
|
|
|
|
if type(arg) != str: continue
|
|
|
|
arguments.append(arg)
|
|
|
|
|
2021-03-29 10:20:57 +00:00
|
|
|
return clientJson,libraries,arguments,jvmArguments
|
2021-03-29 02:16:23 +00:00
|
|
|
|
2021-03-27 23:10:28 +00:00
|
|
|
def main():
|
2021-03-29 02:16:23 +00:00
|
|
|
print("Reading config...")
|
2021-03-28 00:38:06 +00:00
|
|
|
config = configparser.ConfigParser()
|
2021-03-29 23:17:07 +00:00
|
|
|
config.optionxform = str
|
2021-03-28 00:38:06 +00:00
|
|
|
config.read(os.path.splitext(s)[0] + ".ini")
|
|
|
|
|
2021-03-29 02:16:23 +00:00
|
|
|
global lv
|
|
|
|
|
2021-03-28 00:38:06 +00:00
|
|
|
lv = config["default"]
|
2021-03-28 01:28:03 +00:00
|
|
|
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]))
|
|
|
|
|
2021-03-28 00:38:06 +00:00
|
|
|
if lv["osName"] == "":
|
|
|
|
lv["osName"] = platform.system().lower()
|
|
|
|
if lv["osName"] == "darwin": lv["osName"] = "macos"
|
|
|
|
|
2021-03-29 23:16:49 +00:00
|
|
|
if lv["osVersion"] == "":
|
|
|
|
lv["osVersion"] = platform.version()
|
|
|
|
|
2021-03-29 08:52:18 +00:00
|
|
|
if lv["jvmArch"] == "":
|
|
|
|
if "64-Bit" in subprocess.check_output([lv["java"],"-version"]).decode("utf-8"):
|
|
|
|
lv["jvmArch"] = "amd64"
|
|
|
|
else:
|
|
|
|
lv["jvmArch"] = "x86"
|
|
|
|
|
2021-03-29 23:17:35 +00:00
|
|
|
print("")
|
|
|
|
for setting in lv:
|
|
|
|
print(setting+ "=" +str(lv[setting]))
|
|
|
|
|
2021-03-27 23:10:28 +00:00
|
|
|
if len(sys.argv) > 1:
|
|
|
|
for arg in sys.argv[1:]:
|
|
|
|
argSplit = arg.split("=",1)
|
|
|
|
if len(argSplit) > 1:
|
2021-03-28 00:38:06 +00:00
|
|
|
lv[argSplit[0]] = argSplit[1]
|
|
|
|
else:
|
|
|
|
lv[argSplit[0]] = True
|
2021-03-27 23:10:28 +00:00
|
|
|
|
2021-03-29 23:18:02 +00:00
|
|
|
json.loads(lv["jvmArguments"])
|
|
|
|
|
2021-03-28 00:38:06 +00:00
|
|
|
if not lv["osName"] in ["windows","linux","macos"]:
|
2021-03-29 23:18:16 +00:00
|
|
|
print("\nWarning, unsupported OS detected: '" +lv["osName"]+ "'")
|
2021-03-28 00:38:06 +00:00
|
|
|
print("Needs to be either windows, linux or macos. Define it with osName=name in the config.")
|
2021-03-29 02:16:23 +00:00
|
|
|
|
|
|
|
print("")
|
2021-03-28 00:38:06 +00:00
|
|
|
if not "version" in lv: lv["version"] = input("Version ID: ")
|
|
|
|
if not "name" in lv: lv["name"] = input("Player name: ")
|
2021-03-29 02:16:23 +00:00
|
|
|
global tmpFile
|
|
|
|
tmpFile = p(lv["gamePath"],"file.tmp")
|
|
|
|
if os.path.isfile(tmpFile): os.remove(tmpFile)
|
2021-03-27 23:10:28 +00:00
|
|
|
|
2021-03-29 02:16:23 +00:00
|
|
|
print("Scanning .json(s)...")
|
|
|
|
versionsPath = p(lv["gamePath"],"versions")
|
2021-03-28 01:28:03 +00:00
|
|
|
libraryPath = p(lv["gamePath"],"libraries")
|
2021-03-29 02:16:23 +00:00
|
|
|
nativePath = p(lv["gamePath"],"natives")
|
2021-03-29 10:20:57 +00:00
|
|
|
clientJson,libraries,arguments,jvmArguments = processVersion(versionsPath,libraryPath,nativePath,lv["version"])
|
2021-03-29 02:16:23 +00:00
|
|
|
|
|
|
|
versionPath = p(lv["gamePath"],"versions",lv["version"])
|
2021-03-29 08:52:18 +00:00
|
|
|
nativesOutPath = p(versionPath,"natives-" +lv["osName"]+ "." +lv["jvmArch"])
|
2021-03-28 01:28:03 +00:00
|
|
|
assetsPath = p(lv["gamePath"],"assets")
|
2021-03-27 23:10:28 +00:00
|
|
|
|
2021-03-29 05:51:39 +00:00
|
|
|
print("\nDownloading libraries...")
|
2021-03-29 07:33:20 +00:00
|
|
|
for library in libraries:
|
|
|
|
if "url" in library:
|
2021-06-16 09:11:51 +00:00
|
|
|
try:
|
|
|
|
fileDl(library["url"],library["filePathOS"],read = False)
|
|
|
|
except Exception as e:
|
|
|
|
print("Could not download: " +str(e))
|
2021-03-27 23:10:28 +00:00
|
|
|
|
2021-03-29 07:33:20 +00:00
|
|
|
loadLibraries = {}
|
2021-03-29 05:51:39 +00:00
|
|
|
for library in libraries:
|
2021-03-29 07:33:20 +00:00
|
|
|
if library["type"] == "client":
|
|
|
|
loadLibraries["client:" +library["filePathOS"]] = library
|
|
|
|
elif library["type"] == "library":
|
2021-06-17 10:55:28 +00:00
|
|
|
if "rules" in library["data"] and checkRules(library["data"]["rules"]) == "disallow": continue
|
2021-06-17 10:54:58 +00:00
|
|
|
loadLibraries[library["package"] + ":" +library["name"]] = library
|
2021-03-29 07:33:20 +00:00
|
|
|
|
|
|
|
separator = ";"
|
|
|
|
libraryList = ""
|
|
|
|
if lv["osName"] != "windows": separator = ":"
|
2021-06-16 12:44:57 +00:00
|
|
|
print("\nLibraries:")
|
2021-06-17 10:59:00 +00:00
|
|
|
clientJar = ""
|
2021-03-29 07:33:20 +00:00
|
|
|
for libraryID in loadLibraries:
|
|
|
|
library = loadLibraries[libraryID]
|
|
|
|
if os.path.isfile(library["filePathOS"]):
|
|
|
|
if library["type"] == "client":
|
|
|
|
print("Client: " +library["filePathOS"])
|
2021-06-17 10:59:00 +00:00
|
|
|
clientJar = library["filePathOS"]
|
2021-03-29 07:33:20 +00:00
|
|
|
else:
|
2021-06-17 10:54:58 +00:00
|
|
|
print("- " +library["package"]+ ":" +library["name"]+ ":" +library["version"])
|
2021-03-29 07:33:20 +00:00
|
|
|
else:
|
2021-06-17 10:54:58 +00:00
|
|
|
print("Lib not found: " +library["package"]+ ":" + +library["name"]+ ":" +library["version"])
|
2021-03-29 07:33:20 +00:00
|
|
|
|
|
|
|
libraryList += library["filePathOS"] + separator
|
|
|
|
libraryList = libraryList[:-1]
|
2021-03-29 05:51:39 +00:00
|
|
|
|
|
|
|
print("\nExtracting natives...")
|
2021-03-29 02:16:23 +00:00
|
|
|
if not os.path.isdir(nativesOutPath): os.makedirs(nativesOutPath)
|
2021-03-29 07:33:20 +00:00
|
|
|
for library in libraries:
|
|
|
|
if library["type"] == "native":
|
2021-06-16 12:44:57 +00:00
|
|
|
if "rules" in library["data"] and checkRules(library["data"]["rules"]) == "disallow": continue
|
2021-06-16 13:41:19 +00:00
|
|
|
if lv["osName"] != "macos":
|
|
|
|
if library["nativeOS"] != lv["osName"]: continue
|
|
|
|
else:
|
|
|
|
if not library["nativeOS"] in ["macos","osx"]: continue
|
|
|
|
|
2021-06-16 10:55:30 +00:00
|
|
|
if not os.path.isfile(library["filePathOS"]):
|
2021-06-17 10:54:58 +00:00
|
|
|
print("Native not found: " +library["package"]+ ":" +library["name"]+ ":" +library["version"])
|
2021-06-16 10:55:30 +00:00
|
|
|
continue
|
2021-04-01 15:23:29 +00:00
|
|
|
proc = subprocess.Popen(["7z","x",library["filePathOS"],"-o" +nativesOutPath,"-aos"],stdout=subprocess.DEVNULL)
|
|
|
|
rtn = proc.wait()
|
|
|
|
if rtn != 0: raise Exception("process","return code isn't 0")
|
2021-03-27 23:10:28 +00:00
|
|
|
|
2021-06-16 09:12:42 +00:00
|
|
|
print("\nSetting up launcher variables...")
|
2021-03-27 23:10:28 +00:00
|
|
|
launcherVariables = {}
|
2021-03-28 00:38:06 +00:00
|
|
|
launcherVariables["auth_player_name"] = lv["name"]
|
2021-03-29 02:16:23 +00:00
|
|
|
launcherVariables["version_name"] = findInChainDeepest(versionsPath,lv["version"],["id"])
|
2021-03-28 01:28:03 +00:00
|
|
|
launcherVariables["game_directory"] = lv["gamePath"]
|
2021-03-27 23:10:28 +00:00
|
|
|
launcherVariables["assets_root"] = assetsPath
|
2021-06-16 09:13:32 +00:00
|
|
|
try:
|
|
|
|
launcherVariables["assets_index_name"] = findInChain(versionsPath,lv["version"],["assets"])
|
|
|
|
except:
|
|
|
|
print("Could not find assets_index_name, assuming pre-1.6")
|
|
|
|
launcherVariables["assets_index_name"] = "pre-1.6"
|
2021-03-27 23:10:28 +00:00
|
|
|
launcherVariables["auth_access_token"] = "-"
|
2021-03-28 00:38:06 +00:00
|
|
|
launcherVariables["auth_uuid"] = hashlib.md5(lv["name"].encode('utf-8')).hexdigest()
|
2021-03-27 23:10:28 +00:00
|
|
|
launcherVariables["user_type"] = "offline"
|
|
|
|
launcherVariables["version_type"] = clientJson["type"]
|
2021-03-29 10:20:57 +00:00
|
|
|
launcherVariables["natives_directory"] = nativesOutPath
|
|
|
|
launcherVariables["launcher_name"] = "offline-minecraft-launcher"
|
|
|
|
launcherVariables["launcher_version"] = "0.0"
|
|
|
|
launcherVariables["classpath"] = libraryList
|
2021-03-30 12:19:11 +00:00
|
|
|
launcherVariables["game_assets"] = assetsPath
|
|
|
|
launcherVariables["auth_session"] = "-"
|
2021-03-30 12:18:31 +00:00
|
|
|
launcherVariables["user_properties"] = "{}"
|
2021-03-27 23:10:28 +00:00
|
|
|
|
2021-03-30 04:24:13 +00:00
|
|
|
if lv["profileFolder"] == "1":
|
|
|
|
profilePath = p(lv["gamePath"],"profiles")
|
|
|
|
launcherVariables["game_directory"] = p(profilePath,lv["name"],lv["version"])
|
|
|
|
if not os.path.isdir(launcherVariables["game_directory"]): os.makedirs(launcherVariables["game_directory"])
|
|
|
|
os.chdir(launcherVariables["game_directory"])
|
|
|
|
|
2021-03-29 10:20:57 +00:00
|
|
|
# JVM arguments:
|
|
|
|
args = []
|
|
|
|
|
2021-06-17 10:59:00 +00:00
|
|
|
if not findArgument(jvmArguments,"-Djava-library.path="):
|
2021-03-29 10:20:57 +00:00
|
|
|
args.append("-Djava.library.path=" +nativesOutPath)
|
|
|
|
|
2021-06-17 10:59:00 +00:00
|
|
|
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"])
|
|
|
|
|
|
|
|
args.append("-Dminecraft.client.jar=" +clientJar)
|
|
|
|
|
|
|
|
if not findArgument(jvmArguments,"-cp"):
|
2021-03-29 10:20:57 +00:00
|
|
|
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"])
|
2021-03-27 23:10:28 +00:00
|
|
|
args.append(clientJson["mainClass"])
|
|
|
|
|
2021-03-29 02:16:23 +00:00
|
|
|
for arg in arguments:
|
|
|
|
for var in launcherVariables:
|
|
|
|
arg = arg.replace("${" +var+ "}",launcherVariables[var])
|
|
|
|
args.append(arg)
|
2021-03-27 23:10:28 +00:00
|
|
|
|
2021-06-17 10:59:00 +00:00
|
|
|
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"])
|
|
|
|
|
2021-03-29 05:51:39 +00:00
|
|
|
print("\nLaunching Minecraft...")
|
2021-03-28 00:38:06 +00:00
|
|
|
if lv["console"] == "1":
|
2021-04-01 15:23:29 +00:00
|
|
|
proc = subprocess.Popen([lv["java"]] + args)
|
|
|
|
rtn = proc.wait()
|
|
|
|
if rtn != 0: raise Exception("process","return code isn't 0")
|
2021-03-28 00:38:06 +00:00
|
|
|
else:
|
|
|
|
pkwargs = {
|
|
|
|
"stdout": subprocess.DEVNULL,
|
|
|
|
"stdin": subprocess.DEVNULL,
|
2021-06-16 10:55:30 +00:00
|
|
|
"stderr": subprocess.DEVNULL
|
2021-03-28 00:38:06 +00:00
|
|
|
}
|
|
|
|
if lv["osName"] == "windows": pkwargs["creationflags"] = 0x00000008
|
|
|
|
subprocess.Popen([lv["java"] + "w"] + args,**pkwargs)
|
2021-03-27 23:10:28 +00:00
|
|
|
|
|
|
|
main()
|