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.inventory.container.Container' }, 'transformer': function (classNode) { var methods = classNode.methods; var targetMethodName = ASMAPI.mapMethod("func_184996_a"); // slotClick var targetMethodDesc = "(IILnet/minecraft/inventory/container/ClickType;Lnet/minecraft/entity/player/PlayerEntity;)Lnet/minecraft/item/ItemStack;"; for (var i in methods) { var method = methods[i]; if (method.name.equals(targetMethodName) && method.desc.equals(targetMethodDesc)) { transform(method); break; } } return classNode; } } }; } function transform(method) { var instrList = method.instructions; instrList.insert(instrList.get(0), new VarInsnNode(Opcodes.ALOAD, 0)); instrList.insert(instrList.get(1), new VarInsnNode(Opcodes.ILOAD, 1)); instrList.insert(instrList.get(2), new VarInsnNode(Opcodes.ILOAD, 2)); instrList.insert(instrList.get(3), new VarInsnNode(Opcodes.ALOAD, 3)); instrList.insert(instrList.get(4), new VarInsnNode(Opcodes.ALOAD, 4)); instrList.insert(instrList.get(5), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/Hooks", "onSlotClick", "(Lnet/minecraft/inventory/container/Container;IILnet/minecraft/inventory/container/ClickType;Lnet/minecraft/entity/player/PlayerEntity;)Z", false)); var label = new LabelNode(); instrList.insert(instrList.get(6), new JumpInsnNode(Opcodes.IFEQ, label)); instrList.insert(instrList.get(7), new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/item/ItemStack", "EMPTY", "Lnet/minecraft/item/ItemStack;")); instrList.insert(instrList.get(8), new InsnNode(Opcodes.ARETURN)); instrList.insert(instrList.get(9), label); }