|
@@ -0,0 +1,68 @@
|
|
|
+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 InsnNode = Java.type("org.objectweb.asm.tree.InsnNode");
|
|
|
+
|
|
|
+function initializeCoreMod() {
|
|
|
+ return {
|
|
|
+ transformerName: {
|
|
|
+ 'target': {
|
|
|
+ 'type': 'CLASS',
|
|
|
+ 'name': 'net.minecraft.block.Block'
|
|
|
+ },
|
|
|
+ 'transformer': function (classNode) {
|
|
|
+ var methods = classNode.methods;
|
|
|
+
|
|
|
+ var targetMethodNameA = ASMAPI.mapMethod("func_220070_a"); // getDrops
|
|
|
+ var targetMethodNameB = ASMAPI.mapMethod("func_220077_a"); // getDrops
|
|
|
+ var targetMethodDescA = "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/tileentity/TileEntity;)Ljava/util/List;";
|
|
|
+ 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;";
|
|
|
+
|
|
|
+ for (var i in methods) {
|
|
|
+ var method = methods[i];
|
|
|
+ if (method.name.equals(targetMethodNameA) && method.desc.equals(targetMethodDescA)) {
|
|
|
+ transformA(method);
|
|
|
+ }
|
|
|
+ if (method.name.equals(targetMethodNameB) && method.desc.equals(targetMethodDescB)) {
|
|
|
+ transformB(method);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return classNode;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
+function transformA(method) {
|
|
|
+ var instrList = method.instructions;
|
|
|
+ instrList.clear();
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 0));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 1));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 2));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 3));
|
|
|
+ instrList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/Hooks",
|
|
|
+ "getDropsA",
|
|
|
+ "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/server/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/tileentity/TileEntity;)Ljava/util/List;",
|
|
|
+ false));
|
|
|
+ instrList.add(new InsnNode(Opcodes.ARETURN));
|
|
|
+}
|
|
|
+
|
|
|
+function transformB(method) {
|
|
|
+ var instrList = method.instructions;
|
|
|
+ instrList.clear();
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 0));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 1));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 2));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 3));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 4));
|
|
|
+ instrList.add(new VarInsnNode(Opcodes.ALOAD, 5));
|
|
|
+ instrList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "me/kcm/Hooks",
|
|
|
+ "getDropsB",
|
|
|
+ "(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;",
|
|
|
+ false));
|
|
|
+ instrList.add(new InsnNode(Opcodes.ARETURN));
|
|
|
+}
|