java fml_Java FMLDeobfuscatingRemapper類代碼示例

import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; //導入依賴的package包/類

public static void main(String[] args) throws IOException

{

String sourceJar = args[0]; //Clean Vanilla jar minecraft.jar or minecraft_server.jar

String targetDir = args[1]; //Directory containing obfed output classes, typically mcp/reobf/minecraft

String deobfData = args[2]; //Path to FML's deobfusication_data.lzma

String outputDir = args[3]; //Path to place generated .binpatch

String killTarget = args[4]; //"true" if we should destroy the target file if it generated a successful .binpatch

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 = entry != null ? ByteStreams.toByteArray(sourceZip.getInputStream(entry)) : new byte[0];

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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值