block.js 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 InsnNode = Java.type("org.objectweb.asm.tree.InsnNode");
  9. function initializeCoreMod() {
  10. return {
  11. transformerName: {
  12. 'target': {
  13. 'type': 'CLASS',
  14. 'name': 'net.minecraft.block.Block'
  15. },
  16. 'transformer': function (classNode) {
  17. var methods = classNode.methods;
  18. var targetMethodNameA = ASMAPI.mapMethod("func_220070_a"); // getDrops
  19. var targetMethodNameB = ASMAPI.mapMethod("func_220077_a"); // getDrops
  20. var targetMethodDescA = "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/tileentity/TileEntity;)Ljava/util/List;";
  21. var targetMethodDescB = "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/tileentity/TileEntity;Lnet/minecraft/entity/Entity;Lnet/minecraft/item/ItemStack;)Ljava/util/List;";
  22. for (var i in methods) {
  23. var method = methods[i];
  24. if (method.name.equals(targetMethodNameA) && method.desc.equals(targetMethodDescA)) {
  25. transformA(method);
  26. }
  27. if (method.name.equals(targetMethodNameB) && method.desc.equals(targetMethodDescB)) {
  28. transformB(method);
  29. }
  30. }
  31. return classNode;
  32. }
  33. }
  34. };
  35. }
  36. function transformA(method) {
  37. var instrList = method.instructions;
  38. instrList.clear();
  39. instrList.add(new VarInsnNode(Opcodes.ALOAD, 0));
  40. instrList.add(new VarInsnNode(Opcodes.ALOAD, 1));
  41. instrList.add(new VarInsnNode(Opcodes.ALOAD, 2));
  42. instrList.add(new VarInsnNode(Opcodes.ALOAD, 3));
  43. instrList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/Hooks",
  44. "getDropsA",
  45. "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/tileentity/TileEntity;)Ljava/util/List;",
  46. false));
  47. instrList.add(new InsnNode(Opcodes.ARETURN));
  48. }
  49. function transformB(method) {
  50. var instrList = method.instructions;
  51. instrList.clear();
  52. instrList.add(new VarInsnNode(Opcodes.ALOAD, 0));
  53. instrList.add(new VarInsnNode(Opcodes.ALOAD, 1));
  54. instrList.add(new VarInsnNode(Opcodes.ALOAD, 2));
  55. instrList.add(new VarInsnNode(Opcodes.ALOAD, 3));
  56. instrList.add(new VarInsnNode(Opcodes.ALOAD, 4));
  57. instrList.add(new VarInsnNode(Opcodes.ALOAD, 5));
  58. instrList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/Hooks",
  59. "getDropsB",
  60. "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/tileentity/TileEntity;Lnet/minecraft/entity/Entity;Lnet/minecraft/item/ItemStack;)Ljava/util/List;",
  61. false));
  62. instrList.add(new InsnNode(Opcodes.ARETURN));
  63. }