var transformerName = "Font Renderer Transformer"; var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI'); var Opcodes = Java.type('org.objectweb.asm.Opcodes'); var MethodInsnNode = Java.type("org.objectweb.asm.tree.MethodInsnNode"); var FieldInsnNode = Java.type("org.objectweb.asm.tree.FieldInsnNode"); function initializeCoreMod() { return { transformerName: { 'target': { 'type': 'CLASS', 'name': 'net.minecraft.client.gui.FontRenderer' }, 'transformer': function (classNode) { var methods = classNode.methods; var targetMethodName = ASMAPI.mapMethod("func_228081_c_"); // renderStringAtPos var targetMethodDesc = "(Ljava/lang/String;FFIZLnet/minecraft/client/renderer/Matrix4f;Lnet/minecraft/client/renderer/IRenderTypeBuffer;ZII)F"; for (var i in methods) { var method = methods[i]; if (method.name.equals(targetMethodName) && method.desc.equals(targetMethodDesc)) { print(method.name + " " + method.desc); transform(method); break; } } return classNode; } } }; } function transform(method) { var instrList = method.instructions; for (var i = 0; i < instrList.size(); ++i) { var instr = instrList.get(i); if(instr instanceof MethodInsnNode && instr.owner.equals("net/minecraft/util/text/TextFormatting")) { instrList.remove(instr); instrList.insert(instrList.get(i - 1), new MethodInsnNode(instr.getOpcode(), "me/ktcm/ModTextFormatting", ASMAPI.mapMethod(instr.name), instr.desc.replace("net/minecraft/util/text/TextFormatting", "me/ktcm/ModTextFormatting"), false)); } else if(instr instanceof FieldInsnNode && instr.owner.equals("net/minecraft/util/text/TextFormatting")) { instrList.remove(instr); instrList.insert(instrList.get(i - 1), new FieldInsnNode(instr.getOpcode(), "me/ktcm/ModTextFormatting", ASMAPI.mapField(instr.name), instr.desc.replace("net/minecraft/util/text/TextFormatting", "me/ktcm/ModTextFormatting"))); } } }