Skip to content

Instantly share code, notes, and snippets.

@clone1018
Created April 5, 2013 15:31
Show Gist options
  • Save clone1018/5320222 to your computer and use it in GitHub Desktop.
Save clone1018/5320222 to your computer and use it in GitHub Desktop.
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