Search in sources :

Example 1 with FMLDeobfuscatingRemapper

use of net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper in project MinecraftForge by MinecraftForge.

the class GenDiffSet method main.

public static void main(String[] args) throws IOException {
    //Clean Vanilla jar minecraft.jar or minecraft_server.jar
    String sourceJar = args[0];
    //Directory containing obfed output classes, typically mcp/reobf/minecraft
    String targetDir = args[1];
    //Path to FML's deobfusication_data.lzma
    String deobfData = args[2];
    //Path to place generated .binpatch
    String outputDir = args[3];
    //"true" if we should destroy the target file if it generated a successful .binpatch
    String killTarget = args[4];
    LogManager.getLogger("GENDIFF").log(Level.INFO, String.format("Creating patches at %s for %s from %s", outputDir, sourceJar, targetDir));
    Delta delta = new Delta();
    FMLDeobfuscatingRemapper remapper = FMLDeobfuscatingRemapper.INSTANCE;
    remapper.setupLoadOnly(deobfData, false);
    JarFile sourceZip = new JarFile(sourceJar);
    boolean kill = killTarget.equalsIgnoreCase("true");
    File f = new File(outputDir);
    f.mkdirs();
    for (String name : remapper.getObfedClasses()) {
        //            Logger.getLogger("GENDIFF").info(String.format("Evaluating path for data :%s",name));
        String fileName = name;
        String jarName = name;
        if (RESERVED_NAMES.contains(name.toUpperCase(Locale.ENGLISH))) {
            fileName = "_" + name;
        }
        File targetFile = new File(targetDir, fileName.replace('/', File.separatorChar) + ".class");
        jarName = jarName + ".class";
        if (targetFile.exists()) {
            String sourceClassName = name.replace('/', '.');
            String targetClassName = remapper.map(name).replace('/', '.');
            JarEntry entry = sourceZip.getJarEntry(jarName);
            byte[] vanillaBytes = toByteArray(sourceZip, entry);
            byte[] patchedBytes = Files.toByteArray(targetFile);
            byte[] diff = delta.compute(vanillaBytes, patchedBytes);
            ByteArrayDataOutput diffOut = ByteStreams.newDataOutput(diff.length + 50);
            // Original name
            diffOut.writeUTF(name);
            // Source name
            diffOut.writeUTF(sourceClassName);
            // Target name
            diffOut.writeUTF(targetClassName);
            // exists at original
            diffOut.writeBoolean(entry != null);
            if (entry != null) {
                diffOut.writeInt(Hashing.adler32().hashBytes(vanillaBytes).asInt());
            }
            // length of patch
            diffOut.writeInt(diff.length);
            // patch
            diffOut.write(diff);
            File target = new File(outputDir, targetClassName + ".binpatch");
            target.getParentFile().mkdirs();
            Files.write(diffOut.toByteArray(), target);
            Logger.getLogger("GENDIFF").info(String.format("Wrote patch for %s (%s) at %s", name, targetClassName, target.getAbsolutePath()));
            if (kill) {
                targetFile.delete();
                Logger.getLogger("GENDIFF").info(String.format("  Deleted target: %s", targetFile.toString()));
            }
        }
    }
    sourceZip.close();
}
Also used : FMLDeobfuscatingRemapper(net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper) Delta(net.minecraftforge.fml.repackage.com.nothome.delta.Delta) ByteArrayDataOutput(com.google.common.io.ByteArrayDataOutput) JarFile(java.util.jar.JarFile) JarEntry(java.util.jar.JarEntry) JarFile(java.util.jar.JarFile) File(java.io.File)

Aggregations

ByteArrayDataOutput (com.google.common.io.ByteArrayDataOutput)1 File (java.io.File)1 JarEntry (java.util.jar.JarEntry)1 JarFile (java.util.jar.JarFile)1 FMLDeobfuscatingRemapper (net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper)1 Delta (net.minecraftforge.fml.repackage.com.nothome.delta.Delta)1