Skip to content

Instantly share code, notes, and snippets.

@Higgs1
Last active October 27, 2019 23:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Higgs1/6081790 to your computer and use it in GitHub Desktop.
Save Higgs1/6081790 to your computer and use it in GitHub Desktop.
Automatic python installer for OptiForge. (Minecraft 1.6.2, Forge 9.10.1.859, OptiFine HD_U_C4). Patches FML.
#!/usr/bin/env python
# change these variables to install newer versions
minecraft_version = '1.6.2'
forge_version = '9.10.1.859'
optifine_version = 'HD_U_C4'
optiforge_version = '{0} (Forge {1}, OptiFine {2})'.format(
minecraft_version, forge_version.split('.')[-1], optifine_version.replace('_', ' '))
import urllib2, os, multiprocessing, json, time, zipfile
# import datetime, dateutil.tz
minecraft_dir = os.getenv('HOME') + '/.minecraft'
minecraft_verdir = minecraft_dir + '/versions'
minecraft_libdir = minecraft_dir + '/libraries'
def mkdirp(d):
if not os.path.isdir(d):
os.makedirs(d)
def download_file(args):
if not os.path.isfile(args[1]):
print os.path.dirname(args[1])
mkdirp(os.path.dirname(args[1]))
open(args[1], 'w').write(urllib2.urlopen(args[0]).read())
def maven_libjar(s):
p = s.split(':')
return '{0}/{1}/{2}/{1}-{2}.jar'.format(p[0].replace('.','/'), p[1], p[2])
local_libjar = lambda s: minecraft_libdir + '/' + maven_libjar(s)
local_verdir = lambda v: minecraft_verdir + '/' + v
local_verfile = lambda v, t: local_verdir(v) + '/' + v + '.' + t
f, o = 'minecraftforge', 'optifine'
forge_name = 'net.'+f+':'+f+':' + forge_version
optifine_name = 'net.'+o+':'+o+':' + optifine_version
forge_jarfile = local_libjar(forge_name)
files = map(lambda t: (('https://s3.amazonaws.com/Minecraft.Download/versions/{0}/{0}.'+t).format(minecraft_version),
local_verfile(minecraft_version, t)), ('jar', 'json')) + [
('http://files.'+f+'.net/'+f+'/'+f+'-universal-'+minecraft_version+'-'+forge_version+'.jar',
forge_jarfile),
('http://'+o+'.net/download.php?f=OptiFine_'+minecraft_version+'_'+optifine_version+'.zip',
local_libjar(optifine_name))
]
print('Downloading Minecraft, Forge, and OptiFine...')
dlpool = multiprocessing.Pool(processes=4)
dlpool.map(download_file, files)
print('Creating new Minecraft version...')
optiforge_jarfile = local_verfile(optiforge_version, 'jar')
mkdirp(local_verdir(optiforge_version))
if not os.path.isfile(optiforge_jarfile):
os.link(local_verfile(minecraft_version, 'jar'), optiforge_jarfile)
j = json.load(open(local_verfile(minecraft_version, 'json')))
j['id'] = optiforge_version
j['mainClass'] = 'net.minecraft.launchwrapper.Launch'
j['minecraftArguments'] += ' --tweakClass cpw.mods.fml.common.launcher.FMLTweaker'
j['libraries'] += map(lambda n: {'name': n}, ('net.minecraft:launchwrapper:1.3', 'lzma:lzma:0.0.1', forge_name, optifine_name)) + [{'name': 'org.ow2.asm:asm-all:4.1', 'url': 'http://repo1.maven.org/maven2/'}]
# j['releaseTime'], j['time'] = 2*(datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') + '{0:+03d}:{1:02d}'.format(*divmod((time.timezone if not time.localtime().tm_isdst else time.altzone) * -1 / 60, 60)),)
open(local_verfile(optiforge_version, 'json'), 'w').write(json.dumps(j, sort_keys=True, separators=(',', ':')))
print('Patching Forge Mod Loader...')
patch_class = 'cpw/mods/fml/common/patcher/ClassPatchManager.class'
patch_olddata = '\x05false'
patch_newdata = '\x04true'
forge_zipfile = zipfile.ZipFile(forge_jarfile, 'r', zipfile.ZIP_DEFLATED)
d = forge_zipfile.read(patch_class, 'r')
#m = forge_zipfile.read('META-INF/MANIFEST.MF').split('\r\n\r\n')
forge_zipfile.close()
t = d.find('fml.ignorePatchDiscrepancies')
n, d = d[:t], d[t:]
t = d.find(patch_olddata)
if t == -1:
if d.find(patch_newdata) >= 0:
print('\tPatch already detected, skipping.')
else:
print('\tERROR: Could not patch Forge Mod Loader.')
else:
forge_zipfile = zipfile.ZipFile(forge_jarfile, 'a', zipfile.ZIP_DEFLATED)
n += d[:t] + patch_newdata + d[t + len(patch_olddata):]
forge_zipfile.writestr(patch_class, n)
#forge_zipfile.writestr('META-INF/MANIFEST.MF', '\r\n\r\n'.join([i for i in m if i.replace('\r\n ','').find(patch_class) == -1]))
forge_zipfile.writestr('META-INF/FORGE.SF', '')
forge_zipfile.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment