var transformerName = "Dedicated Server Transformer"; var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI'); var Opcodes = Java.type('org.objectweb.asm.Opcodes'); var VarInsnNode = Java.type("org.objectweb.asm.tree.VarInsnNode"); var MethodInsnNode = Java.type("org.objectweb.asm.tree.MethodInsnNode"); var LineNumberNode = Java.type("org.objectweb.asm.tree.LineNumberNode"); var FieldInsnNode = Java.type("org.objectweb.asm.tree.FieldInsnNode"); var JumpInsnNode = Java.type("org.objectweb.asm.tree.JumpInsnNode"); var LabelNode = Java.type("org.objectweb.asm.tree.LabelNode"); var InsnNode = Java.type("org.objectweb.asm.tree.InsnNode"); function initializeCoreMod() { return { transformerName: { 'target': { 'type': 'CLASS', 'name': 'net.minecraft.server.dedicated.DedicatedServer' }, 'transformer': function (classNode) { var methods = classNode.methods; var targetMethodName = ASMAPI.mapMethod("func_71197_b"); // init var targetMethodDesc = "()Z"; for (var i in methods) { var method = methods[i]; print(method.name + " " + method.desc); if (method.name.equals(targetMethodName) && method.desc.equals(targetMethodDesc)) { transform(method); break; } } return classNode; } } }; } function transform(method) { print("Match found " + method.name + " " + method.desc); var instrList = method.instructions; /*instrList.remove(instrList.get(2)); instrList.insert(instrList.get(1), new VarInsnNode(Opcodes.ALOAD, 0)); instrList.insert(instrList.get(2), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks", "onGetTabListDisplayName", "(Lnet/minecraft/entity/player/EntityPlayerMP;)Lnet/minecraft/util/text/ITextComponent;", false));*/ for (var i = 0; i < instrList.size(); ++i) { var instr = instrList.get(i); if (instr.getOpcode() == 183 && instr instanceof MethodInsnNode && instr.owner == "net/minecraft/server/dedicated/DedicatedPlayerList") { print("_________________________________________"); for (var j = -10; j < 10; j++) { printInstr(instrList.get(i + j)); } instrList.remove(instrList.get(i - 4)); instrList.remove(instrList.get(i - 4)); instrList.remove(instrList.get(i - 4)); instrList.remove(instrList.get(i - 4)); instrList.remove(instrList.get(i - 4)); instrList.remove(instrList.get(i - 4)); instrList.insert(instrList.get(i - 5), new VarInsnNode(Opcodes.ALOAD, 0)); //instrList.insert(instrList.get(i - 4), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks", // "newPlayerList", "(Lnet/minecraft/server/dedicated/DedicatedServer;)Lnet/minecraft/server/dedicated/DedicatedPlayerList;", false)); //instrList.insert(instrList.get(i - 3), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks", // "newPlayerList", "()Lnet/minecraft/server/dedicated/DedicatedPlayerList;", false)); instrList.insert(instrList.get(i - 4), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks", "setPlayerList", "(Lnet/minecraft/server/dedicated/DedicatedServer;)V", false)); print("_________________________________________"); for (var j = -10; j < 10; j++) { printInstr(instrList.get(i + j)); } break; } } } function printInstr(instr) { if (instr.getOpcode() == -1) { return; } var out = "> "; out += instr.getOpcode(); out += "_"; out += instr.getType(); if (instr instanceof VarInsnNode) { out += " Var: " + instr.var; } else if (instr instanceof MethodInsnNode) { out += " " + instr.owner + "." + instr.name + ":" + instr.desc; } else if (instr instanceof FieldInsnNode) { out += " " + instr.owner + "." + instr.name + ":" + instr.desc; } else if (instr instanceof JumpInsnNode) { out += " " + instr.label + " " + instr.label.getLabel(); } print(out); }