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