Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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   
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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 )
Ejemplo n.º 6
0
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   
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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   
Ejemplo n.º 10
0
Archivo: fml.py Proyecto: Beliaar/FML
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   
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
Archivo: fml.py Proyecto: djdj/FML
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
Ejemplo n.º 13
0
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())
Ejemplo n.º 14
0
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())
Ejemplo n.º 15
0
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!")
Ejemplo n.º 16
0
Archivo: fml.py Proyecto: Glought/FML
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
Ejemplo n.º 17
0
Archivo: fml.py Proyecto: Samu50/FML
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   
Ejemplo n.º 18
0
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!")