test.js 4.1 KB

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