Add parameters to FML install to enable/disable certian aspects. Applying patches, running transformer/merger, and decompiling server.
This commit is contained in:
parent
1b332fc1ea
commit
d9db242f4c
|
@ -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)
|
||||
|
||||
|
|
|
@ -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'))
|
|
@ -1,4 +1,4 @@
|
|||
echo off
|
||||
@set PATH=%PATH%;%SystemDir%\system32;%SystemRoot%\System32;.\python\
|
||||
python_fml install.py
|
||||
python_fml install.py %*
|
||||
pause
|
||||
|
|
|
@ -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'))
|
||||
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)
|
Loading…
Reference in New Issue