container.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. var transformerName = "Dedicated Server Transformer";
  2. var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI');
  3. var Opcodes = Java.type('org.objectweb.asm.Opcodes');
  4. var VarInsnNode = Java.type("org.objectweb.asm.tree.VarInsnNode");
  5. var MethodInsnNode = Java.type("org.objectweb.asm.tree.MethodInsnNode");
  6. var LineNumberNode = Java.type("org.objectweb.asm.tree.LineNumberNode");
  7. var FieldInsnNode = Java.type("org.objectweb.asm.tree.FieldInsnNode");
  8. var JumpInsnNode = Java.type("org.objectweb.asm.tree.JumpInsnNode");
  9. var LabelNode = Java.type("org.objectweb.asm.tree.LabelNode");
  10. var InsnNode = Java.type("org.objectweb.asm.tree.InsnNode");
  11. function initializeCoreMod() {
  12. return {
  13. transformerName: {
  14. 'target': {
  15. 'type': 'CLASS',
  16. 'name': 'net.minecraft.inventory.container.Container'
  17. },
  18. 'transformer': function (classNode) {
  19. var methods = classNode.methods;
  20. var targetMethodName = ASMAPI.mapMethod("func_184996_a"); // slotClick
  21. var targetMethodDesc = "(IILnet/minecraft/inventory/container/ClickType;Lnet/minecraft/entity/player/PlayerEntity;)Lnet/minecraft/item/ItemStack;";
  22. for (var i in methods) {
  23. var method = methods[i];
  24. if (method.name.equals(targetMethodName) && method.desc.equals(targetMethodDesc)) {
  25. transform(method);
  26. break;
  27. }
  28. }
  29. return classNode;
  30. }
  31. }
  32. };
  33. }
  34. function transform(method) {
  35. var instrList = method.instructions;
  36. instrList.insert(instrList.get(0), new VarInsnNode(Opcodes.ALOAD, 0));
  37. instrList.insert(instrList.get(1), new VarInsnNode(Opcodes.ILOAD, 1));
  38. instrList.insert(instrList.get(2), new VarInsnNode(Opcodes.ILOAD, 2));
  39. instrList.insert(instrList.get(3), new VarInsnNode(Opcodes.ALOAD, 3));
  40. instrList.insert(instrList.get(4), new VarInsnNode(Opcodes.ALOAD, 4));
  41. instrList.insert(instrList.get(5), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/Hooks",
  42. "onSlotClick",
  43. "(Lnet/minecraft/inventory/container/Container;IILnet/minecraft/inventory/container/ClickType;Lnet/minecraft/entity/player/PlayerEntity;)Z", false));
  44. var label = new LabelNode();
  45. instrList.insert(instrList.get(6), new JumpInsnNode(Opcodes.IFEQ, label));
  46. instrList.insert(instrList.get(7), new FieldInsnNode(Opcodes.GETSTATIC, "net/minecraft/item/ItemStack",
  47. "EMPTY",
  48. "Lnet/minecraft/item/ItemStack;"));
  49. instrList.insert(instrList.get(8), new InsnNode(Opcodes.ARETURN));
  50. instrList.insert(instrList.get(9), label);
  51. }