From 3f15cd54c2d776ea161aaedbecad9e188d66578f Mon Sep 17 00:00:00 2001 From: Christian Date: Sun, 30 Jun 2013 21:02:23 -0400 Subject: [PATCH] Functional client @ 1.6.1 --- build.xml | 25 +++++++- .../common/asm/transformers/MCPMerger.java | 8 +-- .../mods/fml/common/launcher/FMLTweaker.java | 1 + .../fml/common/patcher/ClassPatchManager.java | 59 +++++++++++++------ install/fml.py | 2 +- 5 files changed, 71 insertions(+), 24 deletions(-) diff --git a/build.xml b/build.xml index d3088b71a8..b7e70f1526 100644 --- a/build.xml +++ b/build.xml @@ -30,9 +30,13 @@ + + + + @@ -150,7 +154,7 @@ - + @@ -216,7 +220,8 @@ - + + @@ -402,5 +407,21 @@ + + + + + + + + + + + + + + + + diff --git a/common/cpw/mods/fml/common/asm/transformers/MCPMerger.java b/common/cpw/mods/fml/common/asm/transformers/MCPMerger.java index 540151a8bf..ede598ff1c 100644 --- a/common/cpw/mods/fml/common/asm/transformers/MCPMerger.java +++ b/common/cpw/mods/fml/common/asm/transformers/MCPMerger.java @@ -5,7 +5,7 @@ * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * + * * Contributors: * cpw - implementation */ @@ -150,7 +150,7 @@ public class MCPMerger line = line.split("#")[0]; char cmd = line.charAt(0); line = line.substring(1).trim(); - + switch (cmd) { case '!': dontAnnotate.add(line); break; @@ -347,7 +347,7 @@ public class MCPMerger } String entryName = entry.getName(); - + boolean filtered = false; for (String filter : dontProcess) { @@ -357,7 +357,7 @@ public class MCPMerger break; } } - + if (filtered || !entryName.endsWith(".class") || entryName.startsWith(".")) { ZipEntry newEntry = new ZipEntry(entry.getName()); diff --git a/common/cpw/mods/fml/common/launcher/FMLTweaker.java b/common/cpw/mods/fml/common/launcher/FMLTweaker.java index 4c4d132b27..e471de593c 100644 --- a/common/cpw/mods/fml/common/launcher/FMLTweaker.java +++ b/common/cpw/mods/fml/common/launcher/FMLTweaker.java @@ -47,6 +47,7 @@ public class FMLTweaker implements ITweaker { classLoader.addTransformerExclusion("cpw.mods.fml.repackage."); classLoader.addTransformerExclusion("cpw.mods.fml.relauncher."); classLoader.addTransformerExclusion("cpw.mods.fml.common.asm.transformers."); + classLoader.addClassLoaderExclusion("LZMA."); FMLLaunchHandler.configureForClientLaunch(classLoader, this); } diff --git a/common/cpw/mods/fml/common/patcher/ClassPatchManager.java b/common/cpw/mods/fml/common/patcher/ClassPatchManager.java index 6560927510..71ac4ecbab 100644 --- a/common/cpw/mods/fml/common/patcher/ClassPatchManager.java +++ b/common/cpw/mods/fml/common/patcher/ClassPatchManager.java @@ -1,8 +1,11 @@ package cpw.mods.fml.common.patcher; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; +import java.io.InputStream; import java.net.URISyntaxException; import java.security.CodeSource; import java.util.Collections; @@ -10,9 +13,14 @@ import java.util.List; import java.util.Locale; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.jar.JarInputStream; +import java.util.jar.JarOutputStream; +import java.util.jar.Pack200; import java.util.logging.Level; import java.util.regex.Pattern; +import LZMA.LzmaInputStream; + import com.google.common.base.Joiner; import com.google.common.base.Strings; import com.google.common.base.Throwables; @@ -83,18 +91,20 @@ public class ClassPatchManager { public void setup(Side side) { Pattern binpatchMatcher = Pattern.compile(String.format("binpatch/%s/.*.binpatch", side.toString().toLowerCase(Locale.ENGLISH))); - JarFile fmlJar; + JarInputStream jis; try { - FMLRelaunchLog.fine("FML URI is %s", FMLTweaker.getJarLocation()); - File fmlJarFile = new File(FMLTweaker.getJarLocation()); - if (!fmlJarFile.exists() || !fmlJarFile.isFile()) + InputStream binpatchesCompressed = getClass().getResourceAsStream("/binpatches.pack.lzma"); + if (binpatchesCompressed==null) { - FMLRelaunchLog.log(Level.INFO, "Not found an FML jar, I assume you're developing FML. Hi cpw or Lex!"); - patches = ArrayListMultimap.create(); + FMLRelaunchLog.log(Level.SEVERE, "The binary patch set is missing. Things are probably about to go very wrong."); return; } - fmlJar = new JarFile(fmlJarFile); + LzmaInputStream binpatchesDecompressed = new LzmaInputStream(binpatchesCompressed); + ByteArrayOutputStream jarBytes = new ByteArrayOutputStream(); + JarOutputStream jos = new JarOutputStream(jarBytes); + Pack200.newUnpacker().unpack(binpatchesDecompressed, jos); + jis = new JarInputStream(new ByteArrayInputStream(jarBytes.toByteArray())); } catch (Exception e) { @@ -104,28 +114,43 @@ public class ClassPatchManager { patches = ArrayListMultimap.create(); - for (JarEntry entry : Collections.list(fmlJar.entries())) + do { - if (binpatchMatcher.matcher(entry.getName()).matches()) + try { - ClassPatch cp = readPatch(entry, fmlJar); - if (cp != null) + JarEntry entry = jis.getNextJarEntry(); + if (entry == null) { - patches.put(cp.sourceClassName, cp); + break; + } + if (binpatchMatcher.matcher(entry.getName()).matches()) + { + ClassPatch cp = readPatch(entry, jis); + if (cp != null) + { + patches.put(cp.sourceClassName, cp); + } + } + else + { + jis.closeEntry(); } } - } - FMLLog.fine("Read %d binary patches from %s", patches.size(), fmlJar.getName()); + catch (IOException e) + { + } + } while (true); + FMLLog.fine("Read %d binary patches", patches.size()); FMLLog.fine("Patch list :\n\t%s", Joiner.on("\t\n").join(patches.asMap().entrySet())); } - private ClassPatch readPatch(JarEntry patchEntry, JarFile jarFile) + private ClassPatch readPatch(JarEntry patchEntry, JarInputStream jis) { - FMLLog.finest("Reading patch data from %s in file %s", patchEntry.getName(), jarFile.getName()); + FMLLog.finest("Reading patch data from %s", patchEntry.getName()); ByteArrayDataInput input; try { - input = ByteStreams.newDataInput(ByteStreams.toByteArray(jarFile.getInputStream(patchEntry))); + input = ByteStreams.newDataInput(ByteStreams.toByteArray(jis)); } catch (IOException e) { diff --git a/install/fml.py b/install/fml.py index e1b584592f..a5a5ff224c 100644 --- a/install/fml.py +++ b/install/fml.py @@ -85,7 +85,7 @@ def read_mc_versions(fml_dir, version=None, work_dir=None): mc_info['library_dir'] = os.path.join(work_dir, 'libraries') mc_info['client_file'] = os.path.join(version_dir, '%s.jar' % version) mc_info['json_file'] = os.path.join(version_dir, '%s.json' % version) - mc_info['server_file'] = os.path.join(work_dir, 'minecraft_server.jar') + mc_info['server_file'] = os.path.join(work_dir, 'minecraft_server.%s.jar' % version) mc_info['asset_dir'] = os.path.join(work_dir, 'assets') else: mc_info['new_launcher'] = False