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("Decompiling...") src_dir = os.path.join(mcp_dir, "src", "minecraft") if os.path.exists(src_dir): shutil.rmtree(src_dir, True) sys.path.append(mcp_dir) os.chdir(mcp_dir) from runtime.decompile import decompile # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s --rg -w json --nocopy decompile(None, False, False, False, False, False, False, False, False, False, False, True, False, False, None, None, True) os.chdir(base_dir) org_src_dir = os.path.join(mcp_dir, "src", ".minecraft_orig") if os.path.exists(org_src_dir): shutil.rmtree(org_src_dir, True) shutil.copytree(src_dir, org_src_dir) applychanges(mcp_dir)
def main(): print '=================================== Setup Start =================================' skipDecompile = len(sys.argv) > 1 and sys.argv[1] == '-skipdecompile' if not skipDecompile: if not download_ff(mcp_dir): sys.exit(1) if os.path.isdir(src_dir): shutil.rmtree(src_dir) try: pre_decompile() os.chdir(mcp_dir) # Conf JAD CSV -r -d -a -n -p -o -l -g decompile(None, False, False, True, True, False, True, False, False, False, False) reset_logger() os.chdir(forge_dir) post_decompile() except SystemExit, e: print 'Decompile Exception: %d ' % e.code raise e
def main(): print '=================================== Minecraft Forge Setup Start =================================' if os.path.isdir(os.path.join(mcp_dir, 'conf')): shutil.rmtree(os.path.join(mcp_dir, 'conf')) copytree(os.path.join(forge_dir, 'conf'), os.path.join(mcp_dir, 'conf')) if os.path.isdir(src_dir): os.chdir(mcp_dir) cleanup(None, False) reset_logger() os.chdir(forge_dir) if os.path.isdir(src_dir): print 'Please make sure to backup your modified files, and say yes when it asks you to do cleanup.' sys.exit(1) if not download_ff(mcp_dir): sys.exit(1) try: pre_decompile() os.chdir(mcp_dir) # Conf JAD CSV -r -d -a -n -p -o -l -g decompile(None, False, False, True, True, False, True, False, False, False, False) reset_logger() os.chdir(forge_dir) post_decompile() except SystemExit, e: print 'Decompile Exception: %d ' % e.code raise e
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("Decompiling...") src_dir = os.path.join(mcp_dir, "src","minecraft") if os.path.exists( src_dir ): shutil.rmtree( src_dir, True ) sys.path.append(mcp_dir) os.chdir(mcp_dir) from runtime.decompile import decompile # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s --rg -w json --nocopy decompile(None, False, False, False, False, False, False, False, False, False, False, True, False, False, None, None, True ) os.chdir( base_dir ) org_src_dir = os.path.join(mcp_dir, "src",".minecraft_orig") if os.path.exists( org_src_dir ): shutil.rmtree( org_src_dir, True ) shutil.copytree( src_dir, org_src_dir ) applychanges( mcp_dir )
def decompile(mcp_dir, soulforge_dir): from runtime.cleanup import cleanup from runtime.decompile import decompile src_dir = os.path.join(mcp_dir, "src") os.chdir(mcp_dir) if os.path.isdir(src_dir): cleanup(None, False) if os.path.exists(os.path.join(mcp_dir, "src_base")): shutil.rmtree(os.path.join(mcp_dir, "src_base")) reset_logger() decompile(None, False, False, False, False, False, False, False, False, False, False, False, False) reset_logger() os.chdir(soulforge_dir)
def decompile(mcp_dir, bop_dir): from runtime.cleanup import cleanup from runtime.decompile import decompile src_dir = os.path.join(mcp_dir, 'src') os.chdir(mcp_dir) if os.path.isdir(src_dir): cleanup(None, False) if os.path.exists(os.path.join(mcp_dir, 'src_base')): shutil.rmtree(os.path.join(mcp_dir, 'src_base')) reset_logger() decompile(None, False, False, False, False, False, False, False, False, False, False, False, False) reset_logger() os.chdir(bop_dir)
def main(): print '=================================== Setup Start =================================' parser = argparse.ArgumentParser(description='Sets up Forge with MCP.') parser.add_argument('--skipdecompile', action='store_true', help='prevents decompilation during setup') parser.add_argument('--preventconfigclobber', action='store_true', help='prevents overwriting mcp.cfg during setup') args = parser.parse_args() skipDecompile = args.skipdecompile preventConfigClobber = args.preventconfigclobber # print "test args {} {}".format(args.skipdecompile, args.preventconfigclobber) if not preventConfigClobber: if os.path.isdir(mcp_included_conf): shutil.rmtree(mcp_included_conf) shutil.copytree(forge_mcp_conf, mcp_included_conf) print 'Successfully overwrote MCP config folder with the Forge config folder (including patches)! (If you want this to not happen, please use the --preventconfigclobber option!)' if not skipDecompile: if not download_ff(mcp_dir): sys.exit(1) if os.path.isdir(src_dir): shutil.rmtree(src_dir) try: pre_decompile() os.chdir(mcp_dir) # Conf JAD CSV -r -d -a -n -p -o -l -g decompile(None, False, False, True, True, False, True, False, False, False, False) reset_logger() os.chdir(forge_dir) post_decompile() except SystemExit, e: print 'Decompile Exception: %d ' % e.code raise e
def setup_fml(fml_dir, mcp_dir): sys.path.append(mcp_dir) from runtime.decompile import decompile from runtime.cleanup import cleanup from runtime.commands import Commands, CLIENT, SERVER src_dir = os.path.join(mcp_dir, 'src') if os.path.isdir(src_dir): os.chdir(mcp_dir) cleanup(None, False) reset_logger() os.chdir(fml_dir) if os.path.isdir(src_dir): print 'Please make sure to backup your modified files, and say yes when it asks you to do cleanup.' sys.exit(1) #download fernflower/argo/asm/guava if not download_deps(mcp_dir): sys.exit(1) def applyrg_shunt(self, side, reobf=False, applyrg_real = Commands.applyrg): jars = {CLIENT: self.jarclient, SERVER: self.jarserver} binDir = os.path.join(fml_dir, 'bin') if not os.path.isdir(binDir): os.makedirs(binDir) if (side == CLIENT): #Compile AccessTransformer self.logger.info('> Compiling AccessTransformer') forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac).format( classpath=os.pathsep.join(['.', os.path.join(mcp_dir, 'lib', '*')]), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), target=os.path.join(fml_dir, 'common', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'AccessTransformer.java')) if not runcmd(self, forkcmd, echo=False): sys.exit(1) self.logger.info('> Compiling MCPMerger') forkcmd = ('%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac).format( classpath=os.pathsep.join(['.', os.path.join(mcp_dir, 'lib', '*')]), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), target=os.path.join(fml_dir, 'common', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'MCPMerger.java')) if not runcmd(self, forkcmd, echo=False): sys.exit(1) self.logger.info('> Running MCPMerger') #Run MCPMerger forkcmd = ('%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % self.cmdjava).format( classpath=os.pathsep.join([os.path.join(mcp_dir, 'lib', '*'), binDir]), mergecfg=os.path.join(fml_dir, 'mcp_merge.cfg'), client=jars[CLIENT], server=jars[SERVER]) if not runcmd(self, forkcmd): sys.exit(1) self.logger.info('> Running AccessTransformer') #Run AccessTransformer forkcmd = ('%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % self.cmdjava).format( classpath=os.pathsep.join([os.path.join(mcp_dir, 'lib', '*'), binDir]), jar=jars[side], fmlconfig=os.path.join(fml_dir, 'common', 'fml_at.cfg')) forge_cfg = os.path.join(mcp_dir, 'forge', 'common', 'forge_at.cfg') if os.path.isfile(forge_cfg): self.logger.info(' Forge config detected') forkcmd += ' "%s"' % forge_cfg for dirname, dirnames, filenames in os.walk(os.path.join(mcp_dir, 'forge', 'accesstransformers')): for filename in filenames: accesstransformer = os.path.join(dirname, filename) if os.path.isfile(accesstransformer): self.logger.info(' Access Transformer "%s" detected' % filename) forkcmd += ' "%s"' % accesstransformer if not runcmd(self, forkcmd): sys.exit(1) self.logger.info('> Really Applying Retroguard') applyrg_real(self, side, reobf) #Check the original jars not the transformed jars def checkjars_shunt(self, side, checkjars_real = Commands.checkjars): self.jarclient = self.jarclient + '.backup' self.jarserver = self.jarserver + '.backup' #print 'Jar Check %s %s %s' % (side, self.jarclient, self.jarserver) ret = checkjars_real(self, side) self.jarclient = self.jarclient[:-7] self.jarserver = self.jarserver[:-7] #print 'Jar Check out %s %s %s' % (side, self.jarclient, self.jarserver) return ret try: pre_decompile(mcp_dir, fml_dir) os.chdir(mcp_dir) Commands.applyrg = applyrg_shunt Commands.checkjars = checkjars_shunt #decompile -d -n -r # Conf JAD CSV -r -d -a -n -p -o -l -g decompile(None, False, False, True, True, False, True, False, False, False, False) reset_logger() os.chdir(fml_dir) post_decompile(mcp_dir, fml_dir) except SystemExit, e: print 'Decompile Exception: %d ' % e.code raise e
def setup_fml(fml_dir, mcp_dir): sys.path.append(mcp_dir) from runtime.decompile import decompile from runtime.cleanup import cleanup from runtime.commands import Commands, CLIENT, SERVER src_dir = os.path.join(mcp_dir, 'src') if os.path.isdir(src_dir): os.chdir(mcp_dir) cleanup(None, False) reset_logger() os.chdir(fml_dir) if os.path.isdir(src_dir): print 'Please make sure to backup your modified files, and say yes when it asks you to do cleanup.' sys.exit(1) #download fernflower/argo/asm/guava if not download_deps(mcp_dir): sys.exit(1) def applyrg_shunt(self, side, reobf=False, applyrg_real=Commands.applyrg): jars = {CLIENT: self.jarclient, SERVER: self.jarserver} binDir = os.path.join(fml_dir, 'bin') if not os.path.isdir(binDir): os.makedirs(binDir) if (side == CLIENT): #Compile AccessTransformer self.logger.info('> Compiling AccessTransformer') forkcmd = ( '%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac).format( classpath=os.pathsep.join( ['.', os.path.join(mcp_dir, 'lib', '*')]), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), target=os.path.join(fml_dir, 'common', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'AccessTransformer.java')) if not runcmd(self, forkcmd, echo=False): sys.exit(1) self.logger.info('> Compiling MCPMerger') forkcmd = ( '%s -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac).format( classpath=os.pathsep.join( ['.', os.path.join(mcp_dir, 'lib', '*')]), sourcepath=os.path.join(fml_dir, 'common'), outpath=os.path.join(fml_dir, 'bin'), target=os.path.join(fml_dir, 'common', 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers', 'MCPMerger.java')) if not runcmd(self, forkcmd, echo=False): sys.exit(1) self.logger.info('> Running MCPMerger') #Run MCPMerger forkcmd = ( '%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % self.cmdjava).format(classpath=os.pathsep.join( [os.path.join(mcp_dir, 'lib', '*'), binDir]), mergecfg=os.path.join( fml_dir, 'mcp_merge.cfg'), client=jars[CLIENT], server=jars[SERVER]) if not runcmd(self, forkcmd): sys.exit(1) self.logger.info('> Running AccessTransformer') #Run AccessTransformer forkcmd = ( '%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % self.cmdjava).format(classpath=os.pathsep.join( [os.path.join(mcp_dir, 'lib', '*'), binDir]), jar=jars[side], fmlconfig=os.path.join( fml_dir, 'common', 'fml_at.cfg')) forge_cfg = os.path.join(mcp_dir, 'forge', 'common', 'forge_at.cfg') if os.path.isfile(forge_cfg): self.logger.info(' Forge config detected') forkcmd += ' "%s"' % forge_cfg for dirname, dirnames, filenames in os.walk( os.path.join(mcp_dir, 'forge', 'accesstransformers')): for filename in filenames: accesstransformer = os.path.join(dirname, filename) if os.path.isfile(accesstransformer): self.logger.info(' Access Transformer "%s" detected' % filename) forkcmd += ' "%s"' % accesstransformer if not runcmd(self, forkcmd): sys.exit(1) self.logger.info('> Really Applying Retroguard') applyrg_real(self, side, reobf) #Check the original jars not the transformed jars def checkjars_shunt(self, side, checkjars_real=Commands.checkjars): self.jarclient = self.jarclient + '.backup' self.jarserver = self.jarserver + '.backup' #print 'Jar Check %s %s %s' % (side, self.jarclient, self.jarserver) ret = checkjars_real(self, side) self.jarclient = self.jarclient[:-7] self.jarserver = self.jarserver[:-7] #print 'Jar Check out %s %s %s' % (side, self.jarclient, self.jarserver) return ret try: pre_decompile(mcp_dir, fml_dir) os.chdir(mcp_dir) Commands.applyrg = applyrg_shunt Commands.checkjars = checkjars_shunt #decompile -d -n -r # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s decompile(None, False, False, True, True, False, True, False, False, False, False, False, False) reset_logger() os.chdir(fml_dir) post_decompile(mcp_dir, fml_dir) except SystemExit, e: print 'Decompile Exception: %d ' % e.code raise e
def setup_fml(fml_dir, mcp_dir): sys.path.append(mcp_dir) from runtime.decompile import decompile from runtime.cleanup import cleanup from runtime.commands import Commands, CLIENT, SERVER src_dir = os.path.join(mcp_dir, "src") if os.path.isdir(src_dir): os.chdir(mcp_dir) cleanup(None, False) reset_logger() os.chdir(fml_dir) if os.path.isdir(src_dir): print "Please make sure to backup your modified files, and say yes when it asks you to do cleanup." sys.exit(1) # download fernflower/argo/asm/guava if not download_deps(mcp_dir): sys.exit(1) def applyrg_shunt(self, side, reobf=False, applyrg_real=Commands.applyrg): jars = {CLIENT: self.jarclient, SERVER: self.jarserver} dir_bin = os.path.join(fml_dir, "bin") if not os.path.isdir(dir_bin): os.makedirs(dir_bin) class_path = os.pathsep.join([".", os.path.join(mcp_dir, "lib", "*"), dir_bin]) dir_common = os.path.join(fml_dir, "common") dir_trans = os.path.join(dir_common, "cpw", "mods", "fml", "common", "asm", "transformers") cmd_compile = ( '"%s" -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac ) cmd_compile = cmd_compile.format( classpath=class_path, sourcepath=dir_common, outpath=dir_bin, target="{target}" ) if side == CLIENT: self.logger.info("> Compiling AccessTransformer") if not runcmd( self, cmd_compile.format(target=os.path.join(dir_trans, "AccessTransformer.java")), echo=False ): sys.exit(1) self.logger.info("> Compiling MCPMerger") if not runcmd(self, cmd_compile.format(target=os.path.join(dir_trans, "MCPMerger.java")), echo=False): sys.exit(1) self.logger.info("> Running MCPMerger") forkcmd = ( '%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % self.cmdjava ).format( classpath=class_path, mergecfg=os.path.join(fml_dir, "mcp_merge.cfg"), client=jars[CLIENT], server=jars[SERVER], ) if not runcmd(self, forkcmd): sys.exit(1) self.logger.info("> Running AccessTransformer") forkcmd = ( '%s -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % self.cmdjava ).format(classpath=class_path, jar=jars[side], fmlconfig=os.path.join(fml_dir, "common", "fml_at.cfg")) forge_cfg = os.path.join(fml_dir, "..", "common", "forge_at.cfg") if os.path.isfile(forge_cfg): self.logger.info(" Forge config detected") forkcmd += ' "%s"' % forge_cfg for dirname, dirnames, filenames in os.walk(os.path.join(fml_dir, "..", "accesstransformers")): for filename in filenames: accesstransformer = os.path.join(dirname, filename) if os.path.isfile(accesstransformer): self.logger.info(' Access Transformer "%s" detected' % filename) forkcmd += ' "%s"' % accesstransformer if not runcmd(self, forkcmd): sys.exit(1) self.logger.info("> Really Applying Retroguard") applyrg_real(self, side, reobf) # Check the original jars not the transformed jars def checkjars_shunt(self, side, checkjars_real=Commands.checkjars): self.jarclient = self.jarclient + ".backup" self.jarserver = self.jarserver + ".backup" # print 'Jar Check %s %s %s' % (side, self.jarclient, self.jarserver) ret = checkjars_real(self, side) self.jarclient = self.jarclient[:-7] self.jarserver = self.jarserver[:-7] # print 'Jar Check out %s %s %s' % (side, self.jarclient, self.jarserver) return ret try: pre_decompile(mcp_dir, fml_dir) os.chdir(mcp_dir) Commands.applyrg = applyrg_shunt Commands.checkjars = checkjars_shunt # decompile -d -n -r # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s decompile(None, False, False, True, True, False, True, False, False, False, False, True, False) reset_logger() os.chdir(fml_dir) post_decompile(mcp_dir, fml_dir) except SystemExit, e: print "Decompile Exception: %d " % e.code raise e
def main(mcp_dir): print 'Using base dir: %s' % base_dir print 'Using mcp dir: %s (use -m <mcp-dir> to change)' % mcp_dir print 'Preferred architecture: %sbit - preferring %sbit native extraction (use -a 32 or -a 64 to change)' % (preferredarch, preferredarch) if dependenciesOnly: print 'Downloading dependencies ONLY' else: if nomerge is True: print 'NO Optifine merging' if nocompilefixpatch is True: print 'SKIPPING Apply compile fix patches' if nopatch is True: print 'SKIPPING Apply Minecrift patches' if clean == True: print 'Cleaning...' if force == False: print '' print 'WARNING:' print 'The clean option will delete all folders created by MCP, including the' print 'src folder which may contain changes you made to the code, along with any' print 'saved worlds from the client or server.' print 'Minecrift downloaded dependencies will also be removed and re-downloaded.' print 'Patches will be left alone however.' answer = raw_input('If you really want to clean up, enter "Yes" ') if answer.lower() not in ['yes']: print 'You have not entered "Yes", aborting the clean up process' sys.exit(1) print 'Cleaning mcp dir...' reallyrmtree(mcp_dir) print 'Cleaning lib dir...' reallyrmtree(os.path.join(base_dir,'lib')) print 'Cleaning patchsrc dir...' reallyrmtree(os.path.join(base_dir,'patchsrc')) print 'Removing idea project files...' removeIdeaProject(base_dir) print 'Installing mcp...' installAndPatchMcp(mcp_dir) print("\nDownloading dependencies...") if includeForge: download_deps( mcp_dir, True, True ) # Forge libs download_deps( mcp_dir, True, False ) # Vanilla libs if dependenciesOnly: sys.exit(1) 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 ): shutil.rmtree( src_dir, True ) sys.path.append(mcp_dir) os.chdir(mcp_dir) from runtime.decompile import decompile # This *has* to sync with the default options used in <mcpdir>/runtime/decompile.py for # the currently used version of MCP decompile(conffile=None, # -c force_jad=False, # -j force_csv=False, # -s no_recompile=False, # -r no_comments=False, # -d no_reformat=False, # -a no_renamer=False, # -n no_patch=False, # -p only_patch=False, # -o keep_lvt=False, # -l keep_generics=mcp_uses_generics, # -g, True for MCP 1.8.8+, False otherwise only_client=True, # --client only_server=False, # --server force_rg=False, # --rg workdir=None, # -w json=None, # --json nocopy=True # --nocopy ) os.chdir( base_dir ) # Create original decompile src dir org_src_dir = os.path.join(mcp_dir, "src",".minecraft_orig") if os.path.exists( org_src_dir ): shutil.rmtree( org_src_dir, True ) shutil.copytree( src_dir, org_src_dir ) if nocompilefixpatch == False: compile_error_patching_done = False # Patch stage 1: apply only the patches needed to correct the # optifine merge decompile errors mcp_patch_dir = os.path.join( base_dir, "mcppatches", "patches" ) if os.path.exists( mcp_patch_dir ): print("Patching Optifine merge decompile errors...") applychanges( mcp_dir, patch_dir="mcppatches/patches", backup=False, copyOriginal=False, mergeInNew=False ) compile_error_patching_done = True # Address problem files - copy over directly problem_file_dir = os.path.join( base_dir, "mcppatches", "problemfiles" ) if os.path.exists( problem_file_dir ): print("Addressing problem files...") xp_problem_file = os.path.join(problem_file_dir, "xp.java") shutil.copy( xp_problem_file, os.path.join( mcp_dir, "src", "minecraft", "net", "minecraft", "src", "xp.java" ) ) chunkrenderdispatcher_problem_file = os.path.join(problem_file_dir, "ChunkRenderDispatcher.java") shutil.copy( chunkrenderdispatcher_problem_file, os.path.join( mcp_dir, "src", "minecraft", "net", "minecraft", "client", "renderer", "chunk", "ChunkRenderDispatcher.java" ) ) compile_error_patching_done = True # Update the client md5 if compile_error_patching_done == True: print("Updating client.md5...") os.chdir(mcp_dir) from runtime.updatemd5 import updatemd5 updatemd5( None, True, True, False ) os.chdir( base_dir ) # Now re-create the .minecraft_orig with the new buildable state if os.path.exists( org_src_dir ): shutil.rmtree( org_src_dir, True ) shutil.copytree( src_dir, org_src_dir ) if nopatch == False: # Patch stage 2: Now apply our main Minecrift patches, only # changes needed for Minecrift functionality print("Applying full Minecrift patches...") applychanges( mcp_dir ) else: print("Apply patches skipped!") # create idea project if it doesn't already exist if not os.path.exists(os.path.join(base_dir, '.idea')): print("Creating idea project...") createIdeaProject(base_dir, mc_version, os.path.basename(mcp_dir), is32bitPreferred())
def main(mcp_dir): print 'Using base dir: %s' % base_dir print 'Using mcp dir: %s (use -m <mcp-dir> to change)' % mcp_dir print 'Preferred architecture: %sbit - preferring %sbit native extraction (use -a 32 or -a 64 to change)' % (preferredarch, preferredarch) if dependenciesOnly: print 'Downloading dependencies ONLY' else: if nomerge is True: print 'NO Optifine merging' if nocompilefixpatch is True: print 'SKIPPING Apply compile fix patches' if nopatch is True: print 'SKIPPING Apply Minecrift patches' if clean == True: print 'Cleaning...' if force == False: print '' print 'WARNING:' print 'The clean option will delete all folders created by MCP, including the' print 'src folder which may contain changes you made to the code, along with any' print 'saved worlds from the client or server.' print 'Minecrift downloaded dependencies will also be removed and re-downloaded.' print 'Patches will be left alone however.' answer = raw_input('If you really want to clean up, enter "Yes" ') if answer.lower() not in ['yes']: print 'You have not entered "Yes", aborting the clean up process' sys.exit(1) print 'Cleaning mcp dir...' reallyrmtree(mcp_dir) print 'Cleaning lib dir...' reallyrmtree(os.path.join(base_dir,'lib')) print 'Cleaning patchsrc dir...' reallyrmtree(os.path.join(base_dir,'patchsrc')) print 'Removing idea project files...' removeIdeaProject(base_dir) print 'Installing mcp...' installAndPatchMcp(mcp_dir) print("\nDownloading dependencies...") if includeForge: download_deps( mcp_dir, True, True ) # Forge libs download_deps( mcp_dir, False, False ) # Vanilla libs if dependenciesOnly: sys.exit(1) 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 ): shutil.rmtree( src_dir, True ) sys.path.append(mcp_dir) os.chdir(mcp_dir) from runtime.decompile import decompile # This *has* to sync with the default options used in <mcpdir>/runtime/decompile.py for # the currently used version of MCP decompile(conffile=None, # -c force_jad=False, # -j force_csv=False, # -s no_recompile=False, # -r no_comments=False, # -d no_reformat=False, # -a no_renamer=False, # -n no_patch=False, # -p only_patch=False, # -o keep_lvt=False, # -l keep_generics=mcp_uses_generics, # -g, True for MCP 1.8.8+, False otherwise only_client=True, # --client only_server=False, # --server force_rg=False, # --rg workdir=None, # -w json=None, # --json nocopy=True # --nocopy ) os.chdir( base_dir ) # Create original decompile src dir org_src_dir = os.path.join(mcp_dir, "src",".minecraft_orig") if os.path.exists( org_src_dir ): shutil.rmtree( org_src_dir, True ) shutil.copytree( src_dir, org_src_dir ) if nocompilefixpatch == False: compile_error_patching_done = False # Patch stage 1: apply only the patches needed to correct the # optifine merge decompile errors mcp_patch_dir = os.path.join( base_dir, "mcppatches", "patches" ) if os.path.exists( mcp_patch_dir ): print("Patching Optifine merge decompile errors...") applychanges( mcp_dir, patch_dir="mcppatches/patches", backup=False, copyOriginal=False, mergeInNew=False ) compile_error_patching_done = True # Address problem files - copy over directly problem_file_dir = os.path.join( base_dir, "mcppatches", "problemfiles" ) if os.path.exists( problem_file_dir ): print("Addressing problem files...") xp_problem_file = os.path.join(problem_file_dir, "xp.java") shutil.copy( xp_problem_file, os.path.join( mcp_dir, "src", "minecraft", "net", "minecraft", "src", "xp.java" ) ) chunkrenderdispatcher_problem_file = os.path.join(problem_file_dir, "ChunkRenderDispatcher.java") shutil.copy( chunkrenderdispatcher_problem_file, os.path.join( mcp_dir, "src", "minecraft", "net", "minecraft", "client", "renderer", "chunk", "ChunkRenderDispatcher.java" ) ) compile_error_patching_done = True # Update the client md5 if compile_error_patching_done == True: print("Updating client.md5...") os.chdir(mcp_dir) from runtime.updatemd5 import updatemd5 updatemd5( None, True, True, False ) os.chdir( base_dir ) # Now re-create the .minecraft_orig with the new buildable state if os.path.exists( org_src_dir ): shutil.rmtree( org_src_dir, True ) shutil.copytree( src_dir, org_src_dir ) if nopatch == False: # Patch stage 2: Now apply our main Minecrift patches, only # changes needed for Minecrift functionality print("Applying full Minecrift patches...") applychanges( mcp_dir ) else: print("Apply patches skipped!") # create idea project if it doesn't already exist if not os.path.exists(os.path.join(base_dir, '.idea')): print("Creating idea project...") createIdeaProject(base_dir, mc_version, os.path.basename(mcp_dir), is32bitPreferred())
def main(mcp_dir): print 'Using base dir: %s' % base_dir print 'Using mcp dir: %s (use -m <mcp-dir> to change)' % mcp_dir print 'Preferred architecture: %sbit - preferring %sbit native extraction (use -a 32 or -a 64 to change)' % ( preferredarch, preferredarch) if dependenciesOnly: print 'Downloading dependencies ONLY' else: if nomerge is True: print 'NO Optifine merging' if nocompilefixpatch is True: print 'SKIPPING Apply compile fix patches' if nopatch is True: print 'SKIPPING Apply Minecrift patches' if clean == True: print 'Cleaning...' if force == False: print '' print 'WARNING:' print 'The clean option will delete all folders created by MCP, including the' print 'src folder which may contain changes you made to the code, along with any' print 'saved worlds from the client or server.' print 'Minecrift downloaded dependencies will also be removed and re-downloaded.' print 'Patches will be left alone however.' answer = raw_input('If you really want to clean up, enter "Yes" ') if answer.lower() not in ['yes']: print 'You have not entered "Yes", aborting the clean up process' sys.exit(1) print 'Cleaning mcp dir...' reallyrmtree(mcp_dir) print 'Cleaning lib dir...' reallyrmtree(os.path.join(base_dir, 'lib')) print 'Cleaning patchsrc dir...' reallyrmtree(os.path.join(base_dir, 'patchsrc')) print 'Installing mcp...' installAndPatchMcp(mcp_dir) print("\nDownloading dependencies...") download_deps(mcp_dir, True, True) # Forge libs download_deps(mcp_dir, True, False) # Vanilla libs if dependenciesOnly: sys.exit(1) 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): shutil.rmtree(src_dir, True) sys.path.append(mcp_dir) os.chdir(mcp_dir) from runtime.decompile import decompile # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s --rg -w json --nocopy decompile(None, False, False, False, False, False, False, False, False, False, False, True, False, False, None, None, True) os.chdir(base_dir) # Create original decompile src dir org_src_dir = os.path.join(mcp_dir, "src", ".minecraft_orig") if os.path.exists(org_src_dir): shutil.rmtree(org_src_dir, True) shutil.copytree(src_dir, org_src_dir) if nocompilefixpatch == False: compile_error_patching_done = False # Patch stage 1: apply only the patches needed to correct the # optifine merge decompile errors mcp_patch_dir = os.path.join(base_dir, "mcppatches", "patches") if os.path.exists(mcp_patch_dir): print("Patching Optifine merge decompile errors...") applychanges(mcp_dir, patch_dir="mcppatches/patches", backup=False, copyOriginal=False, mergeInNew=False) compile_error_patching_done = True # Address problem files - copy over directly problem_file_dir = os.path.join(base_dir, "mcppatches", "problemfiles") if os.path.exists(problem_file_dir): print("Addressing problem files...") xp_problem_file = os.path.join(problem_file_dir, "xp.java") shutil.copy( xp_problem_file, os.path.join(mcp_dir, "src", "minecraft", "net", "minecraft", "src", "xp.java")) chunkrenderdispatcher_problem_file = os.path.join( problem_file_dir, "ChunkRenderDispatcher.java") shutil.copy( chunkrenderdispatcher_problem_file, os.path.join(mcp_dir, "src", "minecraft", "net", "minecraft", "client", "renderer", "chunk", "ChunkRenderDispatcher.java")) compile_error_patching_done = True # Update the client md5 if compile_error_patching_done == True: print("Updating client.md5...") os.chdir(mcp_dir) from runtime.updatemd5 import updatemd5 updatemd5(None, True, True, False) os.chdir(base_dir) # Now re-create the .minecraft_orig with the new buildable state if os.path.exists(org_src_dir): shutil.rmtree(org_src_dir, True) shutil.copytree(src_dir, org_src_dir) if nopatch == False: # Patch stage 2: Now apply our main Minecrift patches, only # changes needed for Minecrift functionality print("Applying full Minecrift patches...") applychanges(mcp_dir) else: print("Apply patches skipped!")
def setup_fml(fml_dir, mcp_dir, disable_at=False, disable_merge=False, enable_server=False, disable_client=False): global compile_tools sys.path.append(mcp_dir) from runtime.decompile import decompile from runtime.cleanup import cleanup from runtime.commands import Commands, CLIENT, SERVER src_dir = os.path.join(mcp_dir, 'src') if os.path.isdir(src_dir): os.chdir(mcp_dir) cleanup(None, False) reset_logger() os.chdir(fml_dir) if os.path.isdir(src_dir): print 'Please make sure to backup your modified files, and say yes when it asks you to do cleanup.' sys.exit(1) #download fernflower/argo/asm/guava if not download_deps(mcp_dir): sys.exit(1) compile_tools = True def applyrg_shunt(self, side, reobf=False, applyrg_real=Commands.applyrg): global compile_tools if not self.has_wine and not self.has_astyle: self.logger.error( '!! Please install either wine or astyle for source cleanup !!' ) self.logger.error( '!! This is REQUIRED by FML/Forge Cannot proceed !!') sys.exit(1) jars = {CLIENT: self.jarclient, SERVER: self.jarserver} dir_bin = os.path.join(fml_dir, 'bin') if not os.path.isdir(dir_bin): os.makedirs(dir_bin) class_path = os.pathsep.join( ['.', os.path.join(mcp_dir, 'lib', '*'), dir_bin]) dir_common = os.path.join(fml_dir, 'common') dir_trans = os.path.join(dir_common, 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers') java = self.cmdjava.translate(None, '"') javac = self.cmdjavac.translate(None, '"') cmd_compile = '"%s" -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % javac cmd_compile = cmd_compile.format(classpath=class_path, sourcepath=dir_common, outpath=dir_bin, target="{target}") if compile_tools: self.logger.info('> Compiling AccessTransformer') if not runcmd(self, cmd_compile.format(target=os.path.join( dir_trans, 'AccessTransformer.java')), echo=False): sys.exit(1) self.logger.info('> Compiling MCPMerger') if not runcmd( self, cmd_compile.format( target=os.path.join(dir_trans, 'MCPMerger.java')), echo=False): sys.exit(1) compile_tools = False if side == CLIENT: if not disable_merge: self.logger.info('> Running MCPMerger') forkcmd = ( '"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % java).format(classpath=class_path, mergecfg=os.path.join( fml_dir, 'mcp_merge.cfg'), client=jars[CLIENT], server=jars[SERVER]) if not runcmd(self, forkcmd): sys.exit(1) else: self.logger.info('> MCPMerge disabled') if not disable_at: self.logger.info('> Running AccessTransformer') forkcmd = ( '"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % java).format(classpath=class_path, jar=jars[side], fmlconfig=os.path.join(fml_dir, 'common', 'fml_at.cfg')) forge_cfg = os.path.join(fml_dir, '..', 'common', 'forge_at.cfg') if os.path.isfile(forge_cfg): self.logger.info(' Forge config detected') forkcmd += ' "%s"' % forge_cfg for dirname, dirnames, filenames in os.walk( os.path.join(fml_dir, '..', 'accesstransformers')): for filename in filenames: accesstransformer = os.path.join(dirname, filename) if os.path.isfile(accesstransformer): self.logger.info( ' Access Transformer "%s" detected' % filename) forkcmd += ' "%s"' % accesstransformer if not runcmd(self, forkcmd): sys.exit(1) else: self.logger.info('> Access Transformer disabled') self.logger.info('> Really Applying Retroguard') applyrg_real(self, side, reobf) #Check the original jars not the transformed jars def checkjars_shunt(self, side, checkjars_real=Commands.checkjars): self.jarclient = self.jarclient + '.backup' self.jarserver = self.jarserver + '.backup' #print 'Jar Check %s %s %s' % (side, self.jarclient, self.jarserver) ret = checkjars_real(self, side) self.jarclient = self.jarclient[:-7] self.jarserver = self.jarserver[:-7] #print 'Jar Check out %s %s %s' % (side, self.jarclient, self.jarserver) return ret try: pre_decompile(mcp_dir, fml_dir) os.chdir(mcp_dir) Commands.applyrg = applyrg_shunt Commands.checkjars = checkjars_shunt #decompile -d -n -r # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s decompile(None, False, False, True, True, False, True, False, False, False, False, not disable_client, enable_server) reset_logger() os.chdir(fml_dir) post_decompile(mcp_dir, fml_dir) except SystemExit, e: print 'Decompile Exception: %d ' % e.code raise e
def setup_fml(fml_dir, mcp_dir, disable_at=False, disable_merge=False, enable_server=False, disable_client=False): global compile_tools sys.path.append(mcp_dir) from runtime.decompile import decompile from runtime.cleanup import cleanup from runtime.commands import Commands, CLIENT, SERVER src_dir = os.path.join(mcp_dir, 'src') if os.path.isdir(src_dir): os.chdir(mcp_dir) cleanup(None, False) reset_logger() os.chdir(fml_dir) if os.path.isdir(src_dir): print 'Please make sure to backup your modified files, and say yes when it asks you to do cleanup.' sys.exit(1) #download fernflower/argo/asm/guava if not download_deps(mcp_dir): sys.exit(1) compile_tools = True def applyrg_shunt(self, side, reobf=False, applyrg_real = Commands.applyrg): global compile_tools if not self.has_wine and not self.has_astyle: self.logger.error('!! Please install either wine or astyle for source cleanup !!') self.logger.error('!! This is REQUIRED by FML/Forge Cannot proceed !!') sys.exit(1) jars = {CLIENT: self.jarclient, SERVER: self.jarserver} dir_bin = os.path.join(fml_dir, 'bin') if not os.path.isdir(dir_bin): os.makedirs(dir_bin) class_path = os.pathsep.join(['.', os.path.join(mcp_dir, 'lib', '*'), dir_bin]) dir_common = os.path.join(fml_dir, 'common') dir_trans = os.path.join(dir_common, 'cpw', 'mods', 'fml', 'common', 'asm', 'transformers') cmd_compile = '"%s" -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath "{sourcepath}" -d "{outpath}" "{target}"' % self.cmdjavac cmd_compile = cmd_compile.format(classpath=class_path, sourcepath=dir_common, outpath=dir_bin, target="{target}") if compile_tools: self.logger.info('> Compiling AccessTransformer') if not runcmd(self, cmd_compile.format(target=os.path.join(dir_trans, 'AccessTransformer.java')), echo=False): sys.exit(1) self.logger.info('> Compiling MCPMerger') if not runcmd(self, cmd_compile.format(target=os.path.join(dir_trans, 'MCPMerger.java')), echo=False): sys.exit(1) compile_tools = False if side == CLIENT: if not disable_merge: self.logger.info('> Running MCPMerger') forkcmd = ('"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.MCPMerger "{mergecfg}" "{client}" "{server}"' % self.cmdjava).format( classpath=class_path, mergecfg=os.path.join(fml_dir, 'mcp_merge.cfg'), client=jars[CLIENT], server=jars[SERVER]) if not runcmd(self, forkcmd): sys.exit(1) else: self.logger.info('> MCPMerge disabled') if not disable_at: self.logger.info('> Running AccessTransformer') forkcmd = ('"%s" -classpath "{classpath}" cpw.mods.fml.common.asm.transformers.AccessTransformer "{jar}" "{fmlconfig}"' % self.cmdjava).format( classpath=class_path, jar=jars[side], fmlconfig=os.path.join(fml_dir, 'common', 'fml_at.cfg')) forge_cfg = os.path.join(fml_dir, '..', 'common', 'forge_at.cfg') if os.path.isfile(forge_cfg): self.logger.info(' Forge config detected') forkcmd += ' "%s"' % forge_cfg for dirname, dirnames, filenames in os.walk(os.path.join(fml_dir, '..', 'accesstransformers')): for filename in filenames: accesstransformer = os.path.join(dirname, filename) if os.path.isfile(accesstransformer): self.logger.info(' Access Transformer "%s" detected' % filename) forkcmd += ' "%s"' % accesstransformer if not runcmd(self, forkcmd): sys.exit(1) else: self.logger.info('> Access Transformer disabled') self.logger.info('> Really Applying Retroguard') applyrg_real(self, side, reobf) #Check the original jars not the transformed jars def checkjars_shunt(self, side, checkjars_real = Commands.checkjars): self.jarclient = self.jarclient + '.backup' self.jarserver = self.jarserver + '.backup' #print 'Jar Check %s %s %s' % (side, self.jarclient, self.jarserver) ret = checkjars_real(self, side) self.jarclient = self.jarclient[:-7] self.jarserver = self.jarserver[:-7] #print 'Jar Check out %s %s %s' % (side, self.jarclient, self.jarserver) return ret try: pre_decompile(mcp_dir, fml_dir) os.chdir(mcp_dir) Commands.applyrg = applyrg_shunt Commands.checkjars = checkjars_shunt #decompile -d -n -r # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s decompile(None, False, False, True, True, False, True, False, False, False, False, not disable_client, enable_server) reset_logger() os.chdir(fml_dir) post_decompile(mcp_dir, fml_dir) except SystemExit, e: print 'Decompile Exception: %d ' % e.code raise e
def main(mcp_dir): print 'Using base dir: %s' % base_dir print 'Using mcp dir: %s (use -m <mcp-dir> to change)' % mcp_dir print 'Preferred architecture: %sbit - preferring %sbit native extraction (use -a 32 or -a 64 to change)' % (preferredarch, preferredarch) if dependenciesOnly: print 'Downloading dependencies ONLY' else: if nomerge is True: print 'NO Optifine merging' if nocompilefixpatch is True: print 'SKIPPING Apply compile fix patches' if nopatch is True: print 'SKIPPING Apply Minecrift patches' if clean == True: print 'Cleaning...' if force == False: print '' print 'WARNING:' print 'The clean option will delete all folders created by MCP, including the' print 'src folder which may contain changes you made to the code, along with any' print 'saved worlds from the client or server.' print 'Minecrift downloaded dependencies will also be removed and re-downloaded.' print 'Patches will be left alone however.' answer = raw_input('If you really want to clean up, enter "Yes" ') if answer.lower() not in ['yes']: print 'You have not entered "Yes", aborting the clean up process' sys.exit(1) print 'Cleaning mcp dir...' reallyrmtree(mcp_dir) print 'Cleaning lib dir...' reallyrmtree(os.path.join(base_dir,'lib')) print 'Cleaning patchsrc dir...' reallyrmtree(os.path.join(base_dir,'patchsrc')) print 'Installing mcp...' installAndPatchMcp(mcp_dir) print("\nDownloading dependencies...") download_deps( mcp_dir, True, True ) # Forge libs download_deps( mcp_dir, True, False ) # Vanilla libs if dependenciesOnly: sys.exit(1) 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 ): shutil.rmtree( src_dir, True ) sys.path.append(mcp_dir) os.chdir(mcp_dir) from runtime.decompile import decompile # Conf JAD CSV -r -d -a -n -p -o -l -g -c -s --rg -w json --nocopy decompile(None, False, False, False, False, False, False, False, False, False, False, True, False, False, None, None, True ) os.chdir( base_dir ) # Create original decompile src dir org_src_dir = os.path.join(mcp_dir, "src",".minecraft_orig") if os.path.exists( org_src_dir ): shutil.rmtree( org_src_dir, True ) shutil.copytree( src_dir, org_src_dir ) if nocompilefixpatch == False: compile_error_patching_done = False # Patch stage 1: apply only the patches needed to correct the # optifine merge decompile errors mcp_patch_dir = os.path.join( base_dir, "mcppatches", "patches" ) if os.path.exists( mcp_patch_dir ): print("Patching Optifine merge decompile errors...") applychanges( mcp_dir, patch_dir="mcppatches/patches", backup=False, copyOriginal=False, mergeInNew=False ) compile_error_patching_done = True # Address problem files - copy over directly problem_file_dir = os.path.join( base_dir, "mcppatches", "problemfiles" ) if os.path.exists( problem_file_dir ): print("Addressing problem files...") xp_problem_file = os.path.join(problem_file_dir, "xp.java") shutil.copy( xp_problem_file, os.path.join( mcp_dir, "src", "minecraft", "net", "minecraft", "src", "xp.java" ) ) chunkrenderdispatcher_problem_file = os.path.join(problem_file_dir, "ChunkRenderDispatcher.java") shutil.copy( chunkrenderdispatcher_problem_file, os.path.join( mcp_dir, "src", "minecraft", "net", "minecraft", "client", "renderer", "chunk", "ChunkRenderDispatcher.java" ) ) compile_error_patching_done = True # Update the client md5 if compile_error_patching_done == True: print("Updating client.md5...") os.chdir(mcp_dir) from runtime.updatemd5 import updatemd5 updatemd5( None, True, True, False ) os.chdir( base_dir ) # Now re-create the .minecraft_orig with the new buildable state if os.path.exists( org_src_dir ): shutil.rmtree( org_src_dir, True ) shutil.copytree( src_dir, org_src_dir ) if nopatch == False: # Patch stage 2: Now apply our main Minecrift patches, only # changes needed for Minecrift functionality print("Applying full Minecrift patches...") applychanges( mcp_dir ) else: print("Apply patches skipped!")