Created
April 5, 2013 15:31
-
-
Save clone1018/5320222 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package sharose.mods.IDR2.coremod; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import net.minecraft.client.Minecraft; import org.objectweb.asm.*; import org.objectweb.asm.tree.*; import sharose.mods.IDR2.IDR2; import sharose.mods.IDR2.utils.BlockWrapper; import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper; import cpw.mods.fml.relauncher.IClassTransformer; public class IDR2Patcher implements IClassTransformer, Opcodes { @Override public byte[] transform(String name, String transformedName, byte[] bytes) { if (transformedName == "net.minecraft.block.Block") { return transform( name, "(IL" + FMLDeobfuscatingRemapper.INSTANCE .unmap("net/minecraft/block/material/Material") + ";)V", "BlockWrapper", bytes); } if (transformedName == "net.minecraft.item.Item") { return transform(name, "(I)V", "ItemWrapper", bytes); } return bytes; } public byte[] transform(String name, String constructorDesc, String wrapperType, byte[] bytes) { ClassNode cn = new ClassNode(ASM4); ClassReader cr = new ClassReader(bytes); cr.accept(cn, ASM4); boolean fieldExists = false; for (FieldNode field : cn.fields) { if (field.name == "wrapper" && field.desc == "Lsharose/mods/IDR2/utils/" + wrapperType + ";") { fieldExists = true; } } if (!fieldExists) { cn.fields .add(new FieldNode(ACC_PUBLIC, "wrapper", "Lsharose/mods/IDR2/utils/" + wrapperType + ";", null, null)); } for (Object obj : cn.methods) { MethodNode methodNode = (MethodNode) obj; if ("<init>".equals(methodNode.name) && (methodNode.desc == constructorDesc)) { AbstractInsnNode currentNode = methodNode.instructions .getFirst(); boolean working = true; while (working) { if (currentNode.getOpcode() == INVOKESPECIAL) { MethodInsnNode testingNode = (MethodInsnNode) currentNode; if (testingNode.owner == "java/lang/Object" && testingNode.name == "<init>" && testingNode.desc == "()V") { working = false; } } currentNode = currentNode.getNext(); } InsnList IDRCode = new InsnList(); IDRCode.add(new VarInsnNode(ALOAD, 0)); IDRCode.add(new TypeInsnNode(NEW, "sharose/mods/IDR2/utils/" + wrapperType + "")); IDRCode.add(new InsnNode(DUP)); IDRCode.add(new VarInsnNode(ALOAD, 0)); IDRCode.add(new MethodInsnNode(INVOKESPECIAL, "sharose/mods/IDR2/utils/" + wrapperType + "", "<init>", "(L" + name + ";)V")); IDRCode.add(new FieldInsnNode(PUTFIELD, name, "wrapper", "Lsharose/mods/IDR2/utils/" + wrapperType + ";")); IDRCode.add(new VarInsnNode(ALOAD, 0)); IDRCode.add(new FieldInsnNode(GETFIELD, name, "wrapper", "Lsharose/mods/IDR2/utils/" + wrapperType + ";")); IDRCode.add(new VarInsnNode(ILOAD, 1)); IDRCode.add(new MethodInsnNode(INVOKEVIRTUAL, "sharose/mods/IDR2/utils/" + wrapperType + "", "updateObjectSignature", "(I)Z")); IDRCode.add(new InsnNode(POP)); IDRCode.add(new VarInsnNode(ALOAD, 0)); IDRCode.add(new FieldInsnNode(GETFIELD, name, "wrapper", "Lsharose/mods/IDR2/utils/" + wrapperType + ";")); IDRCode.add(new MethodInsnNode(INVOKESTATIC, "sharose/mods/IDR2/IDR2", "getResolvedID", "(Lsharose/mods/IDR2/utils/TypeWrapper;)I")); IDRCode.add(new VarInsnNode(ISTORE, 1)); methodNode.instructions.insertBefore(currentNode, IDRCode); } } ClassWriter cw = new ClassWriter(ASM4); cn.accept(cw); return cw.toByteArray(); } } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment