test.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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.server.dedicated.DedicatedServer'
  17. },
  18. 'transformer': function (classNode) {
  19. var methods = classNode.methods;
  20. var targetMethodName = ASMAPI.mapMethod("func_71197_b"); // init
  21. var targetMethodDesc = "()Z";
  22. for (var i in methods) {
  23. var method = methods[i];
  24. print(method.name + " " + method.desc);
  25. if (method.name.equals(targetMethodName) && method.desc.equals(targetMethodDesc)) {
  26. transform(method);
  27. break;
  28. }
  29. }
  30. return classNode;
  31. }
  32. }
  33. };
  34. }
  35. function transform(method) {
  36. print("Match found " + method.name + " " + method.desc);
  37. var instrList = method.instructions;
  38. /*instrList.remove(instrList.get(2));
  39. instrList.insert(instrList.get(1), new VarInsnNode(Opcodes.ALOAD, 0));
  40. instrList.insert(instrList.get(2), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks",
  41. "onGetTabListDisplayName", "(Lnet/minecraft/entity/player/EntityPlayerMP;)Lnet/minecraft/util/text/ITextComponent;", false));*/
  42. for (var i = 0; i < instrList.size(); ++i) {
  43. var instr = instrList.get(i);
  44. if (instr.getOpcode() == 183 && instr instanceof MethodInsnNode && instr.owner == "net/minecraft/server/dedicated/DedicatedPlayerList") {
  45. print("_________________________________________");
  46. for (var j = -10; j < 10; j++) {
  47. printInstr(instrList.get(i + j));
  48. }
  49. instrList.remove(instrList.get(i - 4));
  50. instrList.remove(instrList.get(i - 4));
  51. instrList.remove(instrList.get(i - 4));
  52. instrList.remove(instrList.get(i - 4));
  53. instrList.remove(instrList.get(i - 4));
  54. instrList.remove(instrList.get(i - 4));
  55. instrList.insert(instrList.get(i - 5), new VarInsnNode(Opcodes.ALOAD, 0));
  56. //instrList.insert(instrList.get(i - 4), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks",
  57. // "newPlayerList", "(Lnet/minecraft/server/dedicated/DedicatedServer;)Lnet/minecraft/server/dedicated/DedicatedPlayerList;", false));
  58. //instrList.insert(instrList.get(i - 3), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks",
  59. // "newPlayerList", "()Lnet/minecraft/server/dedicated/DedicatedPlayerList;", false));
  60. instrList.insert(instrList.get(i - 4), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/events/Hooks",
  61. "setPlayerList", "(Lnet/minecraft/server/dedicated/DedicatedServer;)V", false));
  62. print("_________________________________________");
  63. for (var j = -10; j < 10; j++) {
  64. printInstr(instrList.get(i + j));
  65. }
  66. break;
  67. }
  68. }
  69. }
  70. function printInstr(instr) {
  71. if (instr.getOpcode() == -1) {
  72. return;
  73. }
  74. var out = "> ";
  75. out += instr.getOpcode();
  76. out += "_";
  77. out += instr.getType();
  78. if (instr instanceof VarInsnNode) {
  79. out += " Var: " + instr.var;
  80. }
  81. else if (instr instanceof MethodInsnNode) {
  82. out += " " + instr.owner + "." + instr.name + ":" + instr.desc;
  83. }
  84. else if (instr instanceof FieldInsnNode) {
  85. out += " " + instr.owner + "." + instr.name + ":" + instr.desc;
  86. } else if (instr instanceof JumpInsnNode) {
  87. out += " " + instr.label + " " + instr.label.getLabel();
  88. }
  89. print(out);
  90. }