From 0f69a3b137e48bddc2053e17442be1617294b8a0 Mon Sep 17 00:00:00 2001 From: StellaArtois Date: Wed, 26 Nov 2014 18:07:49 +0000 Subject: [PATCH] Port 1.8 scripting changes to 1.7.10 --- .gitignore | 2 +- applychanges.py | 3 +- build.py | 69 +++++- copybuildanddiffchangestopub.bat | 5 +- create_install.py | 4 +- getchanges.bat | 1 - getchanges.py | 10 +- install.bat | 4 +- install.py | 273 ++++++++++++++++------ installer/Installer.java | 34 +-- installer/installer.jar | Bin 190028 -> 173221 bytes {mcp908/temp => mcppatches}/client.md5 | 0 mcp.cfg.patch => mcppatches/mcp.cfg.patch | 0 minecriftversion.py | 10 + 14 files changed, 313 insertions(+), 102 deletions(-) rename {mcp908/temp => mcppatches}/client.md5 (100%) rename mcp.cfg.patch => mcppatches/mcp.cfg.patch (100%) create mode 100644 minecriftversion.py diff --git a/.gitignore b/.gitignore index bef75a1b..fdcab3ba 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .*.swp /logs/ /*.pyc -/*mcp*/ +/mcp9*/ .idea/ *.iml releases/ diff --git a/applychanges.py b/applychanges.py index 337de6ed..d982275c 100644 --- a/applychanges.py +++ b/applychanges.py @@ -2,6 +2,7 @@ import shutil, fnmatch import subprocess, shlex from optparse import OptionParser +from minecriftversion import mc_version, minecrift_version_num, minecrift_build, of_file_extension, of_file_md5, mcp_version base_dir = os.path.dirname(os.path.abspath(__file__)) @@ -80,4 +81,4 @@ def applychanges(mcp_dir): elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): applychanges(os.path.abspath('..')) else: - applychanges(os.path.abspath('mcp908')) + applychanges(os.path.abspath(mcp_version)) diff --git a/build.py b/build.py index 8c4ad1dc..2108f88b 100644 --- a/build.py +++ b/build.py @@ -2,10 +2,11 @@ import shutil, tempfile,zipfile, fnmatch from optparse import OptionParser import subprocess, shlex - +from tempfile import mkstemp +from shutil import move +from os import remove, close from install import download_deps, download_native, download_file, mkdir_p - -mc_ver ="1.7.10" +from minecriftversion import mc_version, of_file_name, of_json_name, minecrift_version_num, minecrift_build, of_file_extension, of_file_md5, mcp_version, forge_version try: WindowsError @@ -45,13 +46,13 @@ def process_json( addon, version ): json_id = "minecrift-"+version+addon lib_id = "com.mtbs3d:minecrift:"+version time = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S-05:00") - with open(os.path.join("installer",mc_ver+addon+".json"),"rb") as f: + with open(os.path.join("installer",mc_version+addon+".json"),"rb") as f: json_obj = json.load(f) json_obj["id"] = json_id json_obj["time"] = time json_obj["releaseTime"] = time json_obj["libraries"].insert(0,{"name":lib_id}) #Insert at beginning - json_obj["libraries"].append({"name":"net.minecraft:Minecraft:"+mc_ver}) #Insert at end + json_obj["libraries"].append({"name":"net.minecraft:Minecraft:"+mc_version}) #Insert at end return json.dumps( json_obj, indent=1 ) def create_install(mcp_dir): @@ -78,20 +79,51 @@ def create_install(mcp_dir): elif os.getenv("BUILD_NUMBER"): version = "b"+os.getenv("BUILD_NUMBER") else: - version = "PRE4" + version = minecrift_build - version = mc_ver+"-"+version + version = minecrift_version_num+"-"+version + + # Replace version info in installer.java + print "Updating installer versions..." + installer_java_file = os.path.join("installer","Installer.java") + replacelineinfile( installer_java_file, "private static final String MINECRAFT_VERSION", " private static final String MINECRAFT_VERSION = \"%s\";\n" % mc_version ); + replacelineinfile( installer_java_file, "private static final String MC_VERSION", " private static final String MC_VERSION = \"%s\";\n" % minecrift_version_num ); + replacelineinfile( installer_java_file, "private static final String OF_FILE_NAME", " private static final String OF_FILE_NAME = \"%s\";\n" % of_file_name ); + replacelineinfile( installer_java_file, "private static final String OF_JSON_NAME", " private static final String OF_JSON_NAME = \"%s\";\n" % of_json_name ); + replacelineinfile( installer_java_file, "private static final String OF_MD5", " private static final String OF_MD5 = \"%s\";\n" % of_file_md5 ); + replacelineinfile( installer_java_file, "private static final String OF_VERSION_EXT", " private static final String OF_VERSION_EXT = \"%s\";\n" % of_file_extension ); + replacelineinfile( installer_java_file, "private static final String FORGE_VERSION", " private static final String FORGE_VERSION = \"%s\";\n" % forge_version ); + + # Build installer.java + print "Recompiling Installer.java..." + subprocess.Popen( + cmdsplit("javac \"%s\"" % os.path.join(base_dir,installer_java_file)), + cwd=os.path.join(base_dir,"installer"), + bufsize=-1).communicate() artifact_id = "minecrift-"+version installer_id = artifact_id+"-installer" installer = os.path.join( installer_id+".jar" ) shutil.copy( os.path.join("installer","installer.jar"), installer ) with zipfile.ZipFile( installer,'a', zipfile.ZIP_DEFLATED) as install_out: #append to installer.jar + + # Add newly compiled class files + for afile in os.listdir("installer"): + if os.path.isfile(os.path.join("installer",afile)) and afile.endswith('.class'): + print "Adding %s..." % afile + install_out.write(os.path.join("installer",afile), afile) + + # Add json files install_out.writestr( "version.json", process_json("", version)) install_out.writestr( "version-forge.json", process_json("-forge", version)) install_out.writestr( "version-nohydra.json", process_json("-nohydra", version)) install_out.writestr( "version-forge-nohydra.json", process_json("-forge-nohydra", version)) + + # Add version jar - this contains all the changed files (effectively minecrift.jar). A mix + # of obfuscated and non-obfuscated files. install_out.writestr( "version.jar", in_mem_zip.read() ) + + # Add the version info install_out.writestr( "version", artifact_id+":"+version ) print("Creating Installer exe...") @@ -106,12 +138,31 @@ def create_install(mcp_dir): bufsize=-1).communicate() os.unlink( "launch4j.xml" ) +def replacelineinfile(file_path, pattern, subst): + #Create temp file + fh, abs_path = mkstemp() + new_file = open(abs_path,'w') + old_file = open(file_path) + for line in old_file: + if pattern in line: + new_file.write(subst) + else: + new_file.write(line) + #close temp file + new_file.close() + close(fh) + old_file.close() + #Remove original file + remove(file_path) + #Move new file + move(abs_path, file_path) + def main(mcp_dir): print 'Using mcp dir: %s' % mcp_dir print 'Using base dir: %s' % base_dir print("Refreshing dependencies...") - download_deps( mcp_dir ) + download_deps( mcp_dir, False ) sys.path.append(mcp_dir) os.chdir(mcp_dir) @@ -144,4 +195,4 @@ def main(mcp_dir): elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): main(os.path.abspath('..')) else: - main(os.path.abspath('mcp908')) + main(os.path.abspath(mcp_version)) diff --git a/copybuildanddiffchangestopub.bat b/copybuildanddiffchangestopub.bat index 8eefba75..98821b58 100644 --- a/copybuildanddiffchangestopub.bat +++ b/copybuildanddiffchangestopub.bat @@ -1,8 +1,9 @@ SET MINECRIFT_SRCROOT=C:\minecrift-src SET MINECRIFTPUB_SRCROOT=C:\minecrift-public +SET MCP_VERSION=mcp910-pre1 -rmdir /S /Q %MINECRIFTPUB_SRCROOT%\mcp908\src\minecraft -xcopy /E %MINECRIFT_SRCROOT% %MINECRIFTPUB_SRCROOT%\mcp908\src\minecraft\ +rmdir /S /Q %MINECRIFTPUB_SRCROOT%\%MCP_VERSION%\src\minecraft +xcopy /E %MINECRIFT_SRCROOT% %MINECRIFTPUB_SRCROOT%\%MCP_VERSION%\src\minecraft\ cd %MINECRIFTPUB_SRCROOT% call build.bat call getchanges.bat diff --git a/create_install.py b/create_install.py index 65e5cef9..2c4173cd 100644 --- a/create_install.py +++ b/create_install.py @@ -1,3 +1,5 @@ #!/usr/bin/env python from build import create_install -create_install("mcp908") +from install import mcp_version + +create_install(mcp_version) diff --git a/getchanges.bat b/getchanges.bat index 7072c0ce..36e9eb6a 100644 --- a/getchanges.bat +++ b/getchanges.bat @@ -1,3 +1,2 @@ @echo off -REM.\mcp\runtime\bin\python\python_mcp getchanges.py python getchanges.py diff --git a/getchanges.py b/getchanges.py index fd1c8d19..38e54c1c 100644 --- a/getchanges.py +++ b/getchanges.py @@ -4,6 +4,8 @@ import shutil, glob, fnmatch import subprocess, logging, shlex, re from optparse import OptionParser +from minecriftversion import mcp_version, minecrift_version_num, minecrift_build +from build import replacelineinfile base_dir = os.path.dirname(os.path.abspath(__file__)) @@ -14,6 +16,7 @@ def cmdsplit(args): def create_patch( target_dir, src_file, mod_file, label, patch_file ): + print "Checking patch status for %s..." % src_file if os.name == 'nt': diff = os.path.abspath(os.path.join(base_dir, 'bin', 'diff.exe')) else: @@ -62,6 +65,11 @@ def main(mcp_dir): if mod_file[-4:]!="java": continue + if file_ == "Minecraft.java": + # Update Minecrift version + print "Updating Minecraft.java Minecrift version: [Minecrift %s %s] %s" % ( minecrift_version_num, minecrift_build, org_file ) + replacelineinfile( mod_file, "public final String minecriftVerString", " public final String minecriftVerString = \"Minecrift %s %s\";\n" % (minecrift_version_num, minecrift_build) ); + if os.path.exists(org_file): patch_file = os.path.join(patch_dir,file_+".patch") label = pkg.replace("\\","/") + "/" + file_ #patch label always has "/" @@ -85,4 +93,4 @@ def main(mcp_dir): elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): main(os.path.abspath('..')) else: - main(os.path.abspath('mcp908')) + main(os.path.abspath(mcp_version)) diff --git a/install.bat b/install.bat index c3f623f7..84eed607 100644 --- a/install.bat +++ b/install.bat @@ -1,5 +1,3 @@ @echo off +python install.py %* -REM.\mcp\runtime\bin\python\python_mcp install.py -python install.py -pause diff --git a/install.py b/install.py index dbeb3280..2151699d 100644 --- a/install.py +++ b/install.py @@ -3,24 +3,29 @@ import platform import shutil, tempfile, json import errno +import platform +from minecriftversion import mc_version, of_file_name, of_json_name, minecrift_version_num, minecrift_build, of_file_extension, of_file_md5, mcp_version, mc_file_md5 from hashlib import md5 # pylint: disable-msg=E0611 from optparse import OptionParser - from applychanges import applychanges, apply_patch base_dir = os.path.dirname(os.path.abspath(__file__)) -mc_version = "1.7.10" -of_version = mc_version+"_HD_U_A4" -of_file_extension = ".jar" -mcp_version = "mcp908" +preferredarch = '' +nomerge = False try: WindowsError except NameError: WindowsError = OSError +def osArch(): + if platform.machine().endswith('64'): + return '64' + else: + return '32' + def mkdir_p(path): try: os.makedirs(path) @@ -38,24 +43,41 @@ def get_md5(file): def download_file(url, target, md5=None): name = os.path.basename(target) - - if not os.path.isfile(target): + download = True + if not is_non_zero_file(target): + if os.path.isfile(target): + os.remove(target) + download = True + elif not md5 == None and not md5 == "": + if not get_md5(target) == md5: + print 'File Exists but bad MD5!: %s [MD5:%s]' % ( os.path.basename(target), get_md5(target) ) + os.remove(target) + download = True + else: + print 'File Exists: %s [MD5:%s]' % ( os.path.basename(target), get_md5(target) ) + download = False + else: + print 'File Exists: %s' % os.path.basename(target) + download = False + + if download is True: + print 'Downloading: %s' % os.path.basename(target) try: with open(target,"wb") as tf: res = urllib2.urlopen(urllib2.Request( url, headers = {"User-Agent":"Mozilla/5.0"})) tf.write( res.read() ) - if not md5 == None: + if not md5 == None and not md5 == "": if not get_md5(target) == md5: print 'Download of %s failed md5 check, deleting' % name os.remove(target) return False - print 'Downloaded %s' % name except Exception as e: print e print 'Download of %s failed, download it manually from \'%s\' to \'%s\'' % (target, url, target) + if os.path.isfile(target): + os.remove(target) return False - else: - print 'File Exists: %s' % os.path.basename(target) + return True def download_native(url, folder, name): @@ -68,21 +90,41 @@ def download_native(url, folder, name): return True -def download_deps( mcp_dir ): +def is_non_zero_file(fpath): + return True if os.path.isfile(fpath) and os.path.getsize(fpath) > 0 else False + +def download_deps( mcp_dir, download_mc ): + + mcp_exists = True if not os.path.exists(mcp_dir+"/runtime/commands.py "): - download_file( "http://mcp.ocean-labs.de/files/archive/"+mcp_version+".zip", mcp_version+".zip" ) + mcp_exists = False try: - os.mkdir( mcp_dir ) - mcp_zip = zipfile.ZipFile( mcp_version+".zip" ) - mcp_zip.extractall( mcp_dir ) - import stat - astyle = os.path.join(mcp_dir,"runtime","bin","astyle-osx") - st = os.stat( astyle ) - os.chmod(astyle, st.st_mode | stat.S_IEXEC) + mcp_zip_file = os.path.join( base_dir,mcp_version+".zip" ) + if os.path.exists( mcp_zip_file ): + os.mkdir( mcp_dir ) + mcp_zip = zipfile.ZipFile( mcp_zip_file ) + mcp_zip.extractall( mcp_dir ) + import stat + astyle = os.path.join(mcp_dir,"runtime","bin","astyle-osx") + st = os.stat( astyle ) + os.chmod(astyle, st.st_mode | stat.S_IEXEC) + mcp_exists = True except: pass - print("Patching mcp.cfg. ignore \"FAILED\" hunks") - apply_patch( mcp_dir, "mcp.cfg.patch", os.path.join(mcp_dir,"conf")) + + if mcp_exists == False: + print "No %s directory or zip file found. Please copy the %s.zip file into %s and re-run the command." % (mcp_dir, mcp_dir, base_dir) + exit(1) + + print("Patching mcp.cfg. Ignore \"FAILED\" hunks") + apply_patch( mcp_dir, os.path.join("mcppatches", "mcp.cfg.patch"), os.path.join(mcp_dir,"conf")) + + client_md5 = os.path.join("mcppatches","client.md5") + target_client_md5 = os.path.join(mcp_dir,"temp","client.md5") + if not os.path.exists(target_client_md5): + mkdir_p( os.path.join(mcp_dir,"temp") ) + print 'Updating client.md5: copying %s to %s' % (client_md5, target_client_md5) + shutil.copy(client_md5,target_client_md5) jars = os.path.join(mcp_dir,"jars") @@ -98,31 +140,76 @@ def download_deps( mcp_dir ): else: native = "windows" - + flat_lib_dir = os.path.join(base_dir,"lib",mc_version) + flat_native_dir = os.path.join(base_dir,"lib",mc_version,"natives",native) + mkdir_p( flat_lib_dir ) + mkdir_p( flat_native_dir ) + + # Get minecrift json file json_file = os.path.join(versions,mc_version+".json") - shutil.copy( os.path.join("installer",mc_version+".json"),json_file) - - optifine_dir = os.path.join(jars,"libraries","optifine","OptiFine",of_version ) - mkdir_p( optifine_dir ) - - optifine_url = "http://optifine.net/download.php?f=OptiFine_"+of_version+of_file_extension - print 'Downloading Optifine from: %s' % optifine_url - download_file( optifine_url, os.path.join( optifine_dir, "OptiFine-"+of_version+".jar" )) + source_json_file = os.path.join("installer",mc_version+".json") + print 'Updating json: copying %s to %s' % (source_json_file, json_file) + shutil.copy(source_json_file,json_file) + + # Use optifine json name for destination dir and jar names + optifine_dest_dir = os.path.join(jars,"libraries","optifine","OptiFine",of_json_name ) + mkdir_p( optifine_dest_dir ) + + print 'Checking Optifine...' + optifine_jar = "OptiFine-"+of_json_name+".jar" + optifine_dest_file = os.path.join( optifine_dest_dir, optifine_jar ) + + download_optifine = False + optifine_md5 = '' + if not is_non_zero_file( optifine_dest_file ): + download_optifine = True + else: + optifine_md5 = get_md5( optifine_dest_file ) + print 'Optifine md5: %s' % optifine_md5 + if optifine_md5 != of_file_md5: + download_optifine = True + print 'Bad MD5!' + else: + print 'MD5 good!' + + if download_optifine: + # Use optifine filename for URL + optifine_url = "http://optifine.net/download.php?f=OptiFine_"+of_file_name+of_file_extension + print 'Downloading Optifine...' + if not download_file( optifine_url, optifine_dest_file, of_file_md5 ): + print 'FAILED to download Optifine!' + sys.exit(1) + else: + shutil.copy(optifine_dest_file,os.path.join(flat_lib_dir, os.path.basename(optifine_dest_file))) + + if of_file_md5 == "": + optifine_md5 = get_md5( optifine_dest_file ) + print 'Optifine md5: %s' % optifine_md5 + sys.exit(0) json_obj = [] with open(json_file,"rb") as f: + #data=f.read() + #print 'JSON File:\n%s' % data json_obj = json.load( f ) try: newlibs = [] for lib in json_obj['libraries']: + libname = lib["name"] skip = False if "rules" in lib: for rule in lib["rules"]: if "action" in rule and rule["action"] == "allow" and "os" in rule: skip = True + for entry in rule["os"]: + if "name" in entry: + if rule["os"]["name"] == native: + skip = False if skip: + print 'File: %s\nSkipping due to rules' % libname continue + group,artifact,version = lib["name"].split(":") if "url" in lib: repo = lib["url"] @@ -141,49 +228,80 @@ def download_deps( mcp_dir ): file32 = os.path.join(jars,"libraries",url32.replace("/",os.sep)) mkdir_p(os.path.dirname(file32)) download_file( repo + url32, file32 ) + shutil.copy(file32,os.path.join(flat_lib_dir, os.path.basename(file32))) url64 = url.replace('${arch}', '64') file64 = os.path.join(jars,"libraries",url64.replace("/",os.sep)) mkdir_p(os.path.dirname(file64)) - download_file( repo + url64, file64 ) + download_file(repo + url64, file64) + shutil.copy(file64,os.path.join(flat_lib_dir, os.path.basename(file64))) + + # Use preferred architecture to choose which natives to extract. + if preferredarch is '32': + print ' Using preferred arch 32bit' + extractnatives( lib, jars, file32, flat_native_dir ) + else: + print ' Using preferred arch 64bit' + extractnatives( lib, jars, file64, flat_native_dir ) + else: file = os.path.join(jars,"libraries",url.replace("/",os.sep)) mkdir_p(os.path.dirname(file)) - download_file( repo + url, file ) - - if "natives" in lib: - folder = os.path.join(jars,"versions",mc_version,mc_version+"-natives") - mkdir_p(folder) - zip = zipfile.ZipFile(file) - for name in zip.namelist(): - if not name.startswith('META-INF') and not name.endswith('/'): - out_file = os.path.join(folder, name) - if not os.path.isfile(out_file): - print ' Extracting %s' % name - out = open(out_file, 'wb') - out.write(zip.read(name)) - out.flush() - out.close() - + if download_file( repo + url, file ) == True: + shutil.copy(file,os.path.join(flat_lib_dir, os.path.basename(file))) + extractnatives( lib, jars, file, flat_native_dir ) + newlibs.append( lib ) json_obj['libraries'] = newlibs with open(json_file,"wb+") as f: json.dump( json_obj,f, indent=1 ) - except: - pass - - repo = "https://s3.amazonaws.com/Minecraft.Download/" - jar_file = os.path.join(versions,mc_version+".jar") - jar_url = repo + "versions/"+mc_version+"/"+mc_version+".jar" - download_file( jar_url, jar_file ) - + except Exception as e: + print 'ERROR: %s' % e + raise + + if download_mc == True: + repo = "https://s3.amazonaws.com/Minecraft.Download/" + jar_file = os.path.join(versions,mc_version+".jar") + jar_url = repo + "versions/"+mc_version+"/"+mc_version+".jar" + download_file( jar_url, jar_file, mc_file_md5 ) + shutil.copy(jar_file,os.path.join(flat_lib_dir, os.path.basename(jar_file))) + + if mc_file_md5 == "": + mc_md5 = get_md5( jar_file ) + print '%s md5: %s' % ( os.path.basename(jar_file), mc_md5 ) + sys.exit(0) + +def extractnatives( lib, jars, file, copydestdir ): + if "natives" in lib: + folder = os.path.join(jars,"versions",mc_version,mc_version+"-natives") + mkdir_p(folder) + zip = zipfile.ZipFile(file) + #print 'Native extraction: folder: %s, file to unzip: %s' % (folder, file) + for name in zip.namelist(): + if not name.startswith('META-INF') and not name.endswith('/'): + out_file = os.path.join(folder, name) + print ' Extracting native library %s' % name + out = open(out_file, 'wb') + out.write(zip.read(name)) + out.flush() + out.close() + shutil.copy(out_file,os.path.join(copydestdir, os.path.basename(out_file))) def zipmerge( target_file, source_file ): out_file, out_filename = tempfile.mkstemp() out = zipfile.ZipFile(out_filename,'a') - target = zipfile.ZipFile( target_file, 'r') - source = zipfile.ZipFile( source_file, 'r' ) - + try: + target = zipfile.ZipFile( target_file, 'r') + except Exception as e: + print 'zipmerge: target not a zip-file: %s' % target_file + raise + + try: + source = zipfile.ZipFile( source_file, 'r' ) + except Exception as e: + print 'zipmerge: source not a zip-file: %s' % source_file + raise + #source supersedes target source_files = set( source.namelist() ) target_files = set( target.namelist() ) - source_files @@ -225,15 +343,23 @@ def osArch(): return '32' def main(mcp_dir): - print 'Using mcp dir: %s' % mcp_dir print 'Using base dir: %s' % base_dir - print("Downloading dependencies...") - download_deps( mcp_dir ) - - print("Applying Optifine...") - optifine = os.path.join(mcp_dir,"jars","libraries","optifine","OptiFine",of_version,"OptiFine-"+of_version+".jar" ) - zipmerge( os.path.join( mcp_dir,"jars","versions",mc_version,mc_version+".jar"), optifine ) - + print 'Using mcp dir: %s (use -m to change)' % mcp_dir + print 'Preferred architecture: %sbit - preferring %sbit native extraction (use -a 32 or -a 64 to change)' % (preferredarch, preferredarch) + if nomerge is True: + print 'NO Optifine merging' + print("\nDownloading dependencies...") + download_deps( mcp_dir, True ) + + if nomerge == False: + print("Applying Optifine...") + optifine = os.path.join(mcp_dir,"jars","libraries","optifine","OptiFine",of_json_name,"OptiFine-"+of_json_name+".jar" ) + minecraft_jar = os.path.join( mcp_dir,"jars","versions",mc_version,mc_version+".jar") + print ' Merging\n %s\n into\n %s' % (optifine, minecraft_jar) + zipmerge( minecraft_jar, optifine ) + else: + print("Skipping Optifine merge...") + print("Decompiling...") src_dir = os.path.join(mcp_dir, "src","minecraft") if os.path.exists( src_dir ): @@ -256,9 +382,22 @@ def main(mcp_dir): if __name__ == '__main__': parser = OptionParser() + parser.add_option('-o', '--no-optifine', dest='nomerge', default=False, action='store_true', help='If specified, no optifine merge will be carried out') parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='Path to MCP to use', default=None) + parser.add_option('-a', '--architecture', action='store', dest='arch', help='Architecture to use (\'32\' or \'64\'); prefer 32 or 64bit dlls', default=None) options, _ = parser.parse_args() + if not options.arch is None: + if options.arch is '32': + preferredarch = '32' + elif options.arch is '64': + preferredarch = '64' + + if preferredarch is '': + preferredarch = osArch() + + nomerge = options.nomerge + if not options.mcp_dir is None: main(os.path.abspath(options.mcp_dir)) elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): diff --git a/installer/Installer.java b/installer/Installer.java index 16f55d4e..13672d64 100644 --- a/installer/Installer.java +++ b/installer/Installer.java @@ -37,14 +37,16 @@ public class Installer extends JPanel implements PropertyChangeListener { private static final long serialVersionUID = -562178983462626162L; - private static final String MC_VERSION = "1.7.10"; - - private static final String OF_LIB_PATH = "libraries/optifine/OptiFine/"; - private static final String OF_VERSION = "1.7.10_HD_U_A4"; - private static final String OF_MD5 = "FF3FD4C98E267D9D9EEB1296EDFBA5AA"; - private static final String OF_VERSION_EXT = "jar"; - - private static final String FORGE_VERSION = "10.13.0.1180"; + /* DO NOT RENAME THESE STRING CONSTS - THEY ARE USED IN (AND THE VALUES UPDATED BY) THE AUTOMATED BUILD SCRIPTS */ + private static final String MINECRAFT_VERSION = ""; + private static final String MC_VERSION = ""; + private static final String OF_LIB_PATH = "libraries/optifine/OptiFine/"; + private static final String OF_FILE_NAME = ""; + private static final String OF_JSON_NAME = ""; + private static final String OF_MD5 = ""; + private static final String OF_VERSION_EXT = ".jar"; + private static final String FORGE_VERSION = ""; + /* END OF DO NOT RENAME */ private InstallTask task; private static ProgressMonitor monitor; @@ -76,9 +78,9 @@ private boolean DownloadOptiFine() boolean deleted = false; try { - File fod = new File(targetDir,OF_LIB_PATH+OF_VERSION); + File fod = new File(targetDir,OF_LIB_PATH+OF_JSON_NAME); fod.mkdirs(); - File fo = new File(fod,"OptiFine-"+OF_VERSION+".jar"); + File fo = new File(fod,"OptiFine-"+OF_JSON_NAME+".jar"); // Attempt to get the Optifine MD5 String optOnDiskMd5 = GetMd5(fo); @@ -105,7 +107,7 @@ private boolean DownloadOptiFine() // Need to attempt download... FileOutputStream fos = new FileOutputStream(fo); try { - String surl = "http://optifine.net/download.php?f=OptiFine_" + OF_VERSION + "." + OF_VERSION_EXT; + String surl = "http://optifine.net/download.php?f=OptiFine_" + OF_FILE_NAME + "." + OF_VERSION_EXT; URL url = new URL(surl); ReadableByteChannel rbc = Channels.newChannel(url.openStream()); long bytes = fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); @@ -182,12 +184,12 @@ private String GetMd5(File fo) } private boolean SetupMinecraftAsLibrary() { - File lib_dir = new File(targetDir,"libraries/net/minecraft/Minecraft/"+MC_VERSION ); + File lib_dir = new File(targetDir,"libraries/net/minecraft/Minecraft/"+MINECRAFT_VERSION ); lib_dir.mkdirs(); - File lib_file = new File(lib_dir,"Minecraft-"+MC_VERSION+".jar"); + File lib_file = new File(lib_dir,"Minecraft-"+MINECRAFT_VERSION+".jar"); if( lib_file.exists() && lib_file.length() > 4500000 )return true; //TODO: should md5sum it here, I suppose try { - ZipInputStream input_jar = new ZipInputStream(new FileInputStream(new File(targetDir,"versions/"+MC_VERSION+"/"+MC_VERSION+".jar"))); + ZipInputStream input_jar = new ZipInputStream(new FileInputStream(new File(targetDir,"versions/"+MINECRAFT_VERSION+"/"+MINECRAFT_VERSION+".jar"))); ZipOutputStream lib_jar= new ZipOutputStream(new FileOutputStream(lib_file)); ZipEntry ze = null; @@ -370,7 +372,7 @@ public Void doInBackground() { } monitor.setProgress(50); monitor.setNote("Setting up Minecrift as a library..."); - finalMessage = "Failed: Couldn't setup Minecrift "+MC_VERSION+" as library. Have you run "+MC_VERSION+" at least once yet?"; + finalMessage = "Failed: Couldn't setup Minecrift "+MC_VERSION+" as library. Have you run "+MINECRAFT_VERSION+" at least once yet?"; sleep(800); if(!SetupMinecraftAsLibrary()) { @@ -400,7 +402,7 @@ public Void doInBackground() { } if (!downloadedOptifine) { finalMessage = "Installed (but failed to download OptiFine). Restart Minecraft and Edit Profile->Use Version minecrift-" + version + mod + - "\nPlease download and install Optifine " + OF_VERSION + "from https://optifine.net/downloads before attempting to play."; + "\nPlease download and install Optifine " + OF_FILE_NAME + "from https://optifine.net/downloads before attempting to play."; } else { finalMessage = "Installed Successfully! Restart Minecraft and Edit Profile->Use Version minecrift-" + version + mod; diff --git a/installer/installer.jar b/installer/installer.jar index 1a9123c502a7e40ab74735a2c98a3c0263eed1dd..da2a634c1931681ff3ced28344199d06e7672e4d 100644 GIT binary patch delta 79 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 diff --git a/mcp908/temp/client.md5 b/mcppatches/client.md5 similarity index 100% rename from mcp908/temp/client.md5 rename to mcppatches/client.md5 diff --git a/mcp.cfg.patch b/mcppatches/mcp.cfg.patch similarity index 100% rename from mcp.cfg.patch rename to mcppatches/mcp.cfg.patch diff --git a/minecriftversion.py b/minecriftversion.py new file mode 100644 index 00000000..47ac29aa --- /dev/null +++ b/minecriftversion.py @@ -0,0 +1,10 @@ +mc_version = "1.7.10" +mc_file_md5 = "" +of_file_name = "1.7.10_HD_U_A4" +of_json_name = "1.7.10_HD_U_A4" +of_file_md5 = "FF3FD4C98E267D9D9EEB1296EDFBA5AA" +minecrift_version_num = "1.7.10" +minecrift_build = "PRE5" +of_file_extension = ".jar" +mcp_version = "mcp908" +forge_version = "10.13.0.1180" \ No newline at end of file