diff --git a/fml/commands.patch b/fml/commands.patch index a83379470..2e3750e84 100644 --- a/fml/commands.patch +++ b/fml/commands.patch @@ -18,18 +18,7 @@ if not os.path.exists(os.path.join(binlk[side], os.path.normpath(testlk[side] + '.class'))): return False return True -@@ -1029,6 +1033,10 @@ - pathsrclk = {CLIENT: self.srcclient, SERVER: self.srcserver} - pathlog = {CLIENT: self.clientrecomplog, SERVER: self.serverrecomplog} - -+ if side == SERVER: #Disable server because FML recombines it into client -+ self.logger.info('Server side recompiling skipped, this is normal') -+ return -+ - if not os.path.exists(pathbinlk[side]): - os.makedirs(pathbinlk[side]) - -@@ -1062,7 +1070,7 @@ +@@ -1062,7 +1066,7 @@ raise def startserver(self): @@ -38,7 +27,7 @@ classpath = [os.path.join('..', p) for p in classpath] classpath = os.pathsep.join(classpath) os.chdir(self.dirjars) -@@ -1070,7 +1078,7 @@ +@@ -1070,7 +1074,7 @@ self.runmc(forkcmd) def startclient(self): @@ -47,7 +36,7 @@ classpath = [os.path.join('..', p) for p in classpath] classpath = os.pathsep.join(classpath) natives = os.path.join('..', self.dirnatives) -@@ -1197,20 +1205,20 @@ +@@ -1197,20 +1201,20 @@ with open(self.csvmethods, 'rb') as fh: methodsreader = csv.DictReader(fh) for row in methodsreader: @@ -71,7 +60,7 @@ names['params'][row['param']] = row['name'] regexps = { -@@ -1344,13 +1352,13 @@ +@@ -1344,13 +1348,13 @@ methods = {} for row in methodsreader: #HINT: Only include methods that have a non-empty description @@ -87,7 +76,7 @@ fields[row['searge']] = row['desc'].replace('*/', '* /') regexps = { -@@ -1427,7 +1435,7 @@ +@@ -1427,7 +1431,7 @@ self.runcmd(forkcmd) return True @@ -96,7 +85,7 @@ if not reobf: md5lk = {CLIENT: self.md5client, SERVER: self.md5server} else: -@@ -1442,6 +1450,9 @@ +@@ -1442,6 +1446,9 @@ class_path = '' else: class_path += '/' @@ -106,7 +95,7 @@ for class_file in fnmatch.filter(filelist, '*.class'): class_name = class_path + os.path.splitext(class_file)[0] bin_file = os.path.normpath(os.path.join(path, class_file)) -@@ -1535,6 +1546,8 @@ +@@ -1535,6 +1542,8 @@ if not os.path.exists(outpathlk[side]): os.makedirs(outpathlk[side]) @@ -115,7 +104,7 @@ # HINT: We extract the modified class files with closing(zipfile.ZipFile(jarlk[side])) as zipjar: for in_class in trgclasses: -@@ -1548,6 +1561,23 @@ +@@ -1548,6 +1557,23 @@ out_class = out_class.replace(self.nullpkg, '') if out_class[0] == '/': out_class = out_class[1:] @@ -139,7 +128,7 @@ try: zipjar.extract(out_class, outpathlk[side]) self.logger.info('> Outputted %s to %s as %s', in_class.ljust(35), outpathlk[side], out_class) -@@ -1594,6 +1624,9 @@ +@@ -1594,6 +1620,9 @@ sys.exit(1) for entry in newfiles: @@ -149,7 +138,7 @@ if entry[3] == 'U': self.logger.info('Retrieving file from server : %s', entry[0]) cur_file = os.path.normpath(entry[0]) -@@ -1614,6 +1647,9 @@ +@@ -1614,6 +1643,9 @@ md5reoblk = {CLIENT: self.md5reobfclient, SERVER: self.md5reobfserver} outpathlk = {CLIENT: self.srcmodclient, SERVER: self.srcmodserver} src = {CLIENT: self.srcclient, SERVER: self.srcserver} @@ -159,7 +148,7 @@ # HINT: We need a table for the old md5 and the new ones md5table = {} -@@ -1656,3 +1692,6 @@ +@@ -1656,3 +1688,6 @@ except IOError: self.logger.error('* File %s copy failed', in_class) diff --git a/fml/install/fml.py b/fml/install/fml.py index de4d31821..419beea7e 100644 --- a/fml/install/fml.py +++ b/fml/install/fml.py @@ -219,7 +219,9 @@ def cleanup_source(path): src_file = os.path.normpath(os.path.join(path, cur_file)) updatefile(src_file) -def setup_fml(fml_dir, mcp_dir): +compile_tools = True +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 @@ -241,7 +243,10 @@ def setup_fml(fml_dir, mcp_dir): 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 !!') @@ -258,7 +263,7 @@ def setup_fml(fml_dir, mcp_dir): 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): + 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) @@ -266,32 +271,41 @@ def setup_fml(fml_dir, mcp_dir): 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]) + 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) - - 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) @@ -314,8 +328,8 @@ def setup_fml(fml_dir, 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) + # 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) @@ -334,8 +348,14 @@ def setup_fml(fml_dir, mcp_dir): os.chdir(mcp_dir) commands = Commands(verify=True) - updatemd5_side(mcp_dir, commands, CLIENT) - reset_logger() + + if not disable_client: + updatemd5_side(mcp_dir, commands, CLIENT) + reset_logger() + + if enable_server: + updatemd5_side(mcp_dir, commands, CLIENT) + reset_logger() os.chdir(fml_dir) @@ -409,16 +429,16 @@ def apply_fml_patches(fml_dir, mcp_dir, src_dir, copy_files=True): if os.path.isdir(os.path.join(src_dir, 'minecraft', 'argo')): shutil.rmtree(os.path.join(src_dir, 'minecraft', 'argo')) -def finish_setup_fml(fml_dir, mcp_dir): +def finish_setup_fml(fml_dir, mcp_dir, enable_server=False, disable_client=False): sys.path.append(mcp_dir) from runtime.updatenames import updatenames from runtime.updatemd5 import updatemd5 from runtime.updatemcp import updatemcp os.chdir(mcp_dir) - updatenames(None, True, True, False) + updatenames(None, True, not disable_client, enable_server) reset_logger() - updatemd5(None, True, True, False) + updatemd5(None, True, not disable_client, enable_server) reset_logger() os.chdir(fml_dir) @@ -940,18 +960,21 @@ def gen_renamed_conf(mcp_dir, fml_dir): cls = repackage_class(pkgs, cls) outf.write('%s.%s%s=%s\n' % (cls, func, sig, named)) - print 'Creating re-packaged MCP patch' - patch_in = os.path.join(mcp_dir, 'conf', 'patches', 'minecraft_ff.patch') - patch_tmp = os.path.join(mcp_dir, 'conf', 'patches', 'minecraft_ff.patch.tmp') + print 'Creating re-packaged MCP patches' - regnms = re.compile(r'net\\minecraft\\src\\(\w+)') - with open(patch_in, 'r') as fh: - buf = fh.read() - def mapname(match): - return repackage_class(pkgs, match.group(0).replace('\\', '/')).replace('/', '\\') - buf = regnms.sub(mapname, buf) - - with open(patch_tmp, 'w') as fh: - fh.write(buf) - - shutil.move(patch_tmp, patch_in) + def fix_patches(patch_in, patch_tmp): + regnms = re.compile(r'net\\minecraft\\src\\(\w+)') + with open(patch_in, 'r') as fh: + buf = fh.read() + def mapname(match): + return repackage_class(pkgs, match.group(0).replace('\\', '/')).replace('/', '\\') + buf = regnms.sub(mapname, buf) + + with open(patch_tmp, 'w') as fh: + fh.write(buf) + + shutil.move(patch_tmp, patch_in) + + patch_dir = os.path.join(mcp_dir, 'conf', 'patches') + fix_patches(os.path.join(patch_dir, 'minecraft_ff.patch' ), os.path.join(patch_dir, 'tmp.patch')) + fix_patches(os.path.join(patch_dir, 'minecraft_server_ff.patch'), os.path.join(patch_dir, 'tmp.patch')) \ No newline at end of file diff --git a/fml/install/install.bat b/fml/install/install.bat index 4698e2b22..b31f47729 100644 --- a/fml/install/install.bat +++ b/fml/install/install.bat @@ -1,4 +1,4 @@ echo off @set PATH=%PATH%;%SystemDir%\system32;%SystemRoot%\System32;.\python\ -python_fml install.py +python_fml install.py %* pause diff --git a/fml/install/install.py b/fml/install/install.py index 5971c78af..97dec1770 100644 --- a/fml/install/install.py +++ b/fml/install/install.py @@ -3,24 +3,41 @@ from optparse import OptionParser from fml import setup_fml, finish_setup_fml, apply_fml_patches, setup_mcp -def fml_main(fml_dir, mcp_dir, dont_gen_conf=True): +def fml_main(fml_dir, mcp_dir, dont_gen_conf=True, disable_patches=False, disable_at=False, disable_merge=False, enable_server=False, disable_client=False): print '================ Forge ModLoader Setup Start ===================' setup_mcp(fml_dir, mcp_dir, dont_gen_conf) - setup_fml(fml_dir, mcp_dir) - apply_fml_patches(fml_dir, mcp_dir, os.path.join(mcp_dir, 'src')) - finish_setup_fml(fml_dir, mcp_dir) + setup_fml(fml_dir, mcp_dir, disable_at=disable_at, disable_merge=disable_merge, enable_server=enable_server, disable_client=disable_client) + if disable_patches: + print 'Patching disabled' + else: + apply_fml_patches(fml_dir, mcp_dir, os.path.join(mcp_dir, 'src')) + finish_setup_fml(fml_dir, mcp_dir, enable_server=enable_server, disable_client=disable_client) print '================ Forge ModLoader Setup End ===================' if __name__ == '__main__': parser = OptionParser() - parser.add_option('-m', '--mcp-dir', action='store_true', dest='mcp_dir', help='Path to download/extract MCP to', default=None) + parser.add_option('-m', '--mcp-dir', action='store_true', dest='mcp_dir', help='Path to download/extract MCP to', default=None ) + parser.add_option('-p', '--no-patch', action="store_true", dest='no_patch', help='Disable application of FML patches', default=False) + parser.add_option('-a', '--no-access', action="store_true", dest='no_access', help='Disable access transformers', default=False) + parser.add_option('-s', '--server', action="store_true", dest='enable_server', help='Enable decompilation of server', default=False) + parser.add_option('-c', '--no-client', action="store_true", dest='no_client', help='Disable decompilation of server', default=False) + parser.add_option('-e', '--no-merge', action="store_true", dest='no_merge', help='Disable merging server code into client', default=False) options, _ = parser.parse_args() fml_dir = os.path.dirname(os.path.abspath(__file__)) + mcp_dir = os.path.abspath('mcp') if not options.mcp_dir is None: - fml_main(fml_dir, os.path.abspath(options.mcp_dir)) + mcp_dir = os.path.abspath(options.mcp_dir) elif os.path.isfile(os.path.join('..', 'runtime', 'commands.py')): - fml_main(fml_dir, os.path.abspath('..')) - else: - fml_main(fml_dir, os.path.abspath('mcp')) \ No newline at end of file + mcp_dir = os.path.abspath('..') + + if options.no_client: + options.no_patch = True + + if options.no_merge: + options.no_patch = True + + fml_main(fml_dir, mcp_dir, disable_patches=options.no_patch, + disable_at=options.no_access, disable_merge=options.no_merge, + enable_server=options.enable_server, disable_client=options.no_client) \ No newline at end of file