Skip to content

Instantly share code, notes, and snippets.

@Cadiboo
Last active June 8, 2019 01:12
Show Gist options
  • Save Cadiboo/f3f2c5ae47f48d6f2ee15249c41fcf75 to your computer and use it in GitHub Desktop.
Save Cadiboo/f3f2c5ae47f48d6f2ee15249c41fcf75 to your computer and use it in GitHub Desktop.
var transformerName = "Gigaherz PlayerContainer Transformer";
var targetClass = "net.minecraft.inventory.container.PlayerContainer";
function initializeCoreMod() {
return {
transformerName: {
'target': {
'type': 'CLASS',
'name': targetClass
},
'transformer': function(classNode) {
var methods = classNode.methods;
log("Adding methods...");
{
start("Adding setAll");
methods.add(make_setAll());
finish();
}
log("Finished adding methods");
return classNode;
}
}
}
}
// Local variable indexes
var ALOCALVARIABLE_this = 0;
var ALOCALVARIABLE_stacks = 1;
// // access flags 0x1
// // signature (Ljava/util/List<Lnet/minecraft/item/ItemStack;>;)V
// // declaration: void setAll(java.util.List<net.minecraft.item.ItemStack>)
// public setAll(Ljava/util/List;)V
// L0
// LINENUMBER 225 L0
// ALOAD 0
// ALOAD 1
// INVOKESPECIAL net/minecraft/inventory/container/RecipeBookContainer.setAll (Ljava/util/List;)V
// L1
// LINENUMBER 226 L1
// ALOAD 0
// ALOAD 1
// INVOKESTATIC io/github/cadiboo/nocubes/hooks/Hooks.setAll (Lnet/minecraft/inventory/container/PlayerContainer;Ljava/util/List;)V
// L2
// LINENUMBER 227 L2
// RETURN
function make_setAll() {
var setAllName = mapMethod("func_190896_a");
var method = new MethodNode(
// final int access,
ACC_PUBLIC,
// final String name,
setAllName,
// final String descriptor,
"(Ljava/util/List;)V",
// final String signature,
"(Ljava/util/List<Lnet/minecraft/item/ItemStack;>;)V",
// final String[] exceptions
null
);
method.instructions.add(new LabelNode()); // super call
method.instructions.add(new VarInsnNode(ALOAD, ALOCALVARIABLE_this));
method.instructions.add(new VarInsnNode(ALOAD, ALOCALVARIABLE_stacks));
method.instructions.add(new MethodInsnNode(
//int opcode
INVOKESPECIAL,
//String owner
"net/minecraft/inventory/container/RecipeBookContainer",
//String name
setAllName,
//String descriptor
"(Ljava/util/List;)V",
//boolean isInterface
false
));
method.instructions.add(new LabelNode()); // hook call
method.instructions.add(new VarInsnNode(ALOAD, ALOCALVARIABLE_this));
method.instructions.add(new VarInsnNode(ALOAD, ALOCALVARIABLE_stacks));
method.instructions.add(new MethodInsnNode(
//int opcode
INVOKESTATIC,
//String owner
"GIGA_REPLACE PlayerContainerHook",
//String name
"afterSetAll",
//String descriptor
"(Lnet/minecraft/inventory/container/PlayerContainer;Ljava/util/List;)V",
//boolean isInterface
false
));
method.instructions.add(new LabelNode()); // return
method.instructions.add(new InsnNode(RETURN));
return method;
}
function TargetMethod(name, desc, transformer1, transformer2, transformer3) { //Var args seems not to work :/
this.name = name;
this.desc = desc;
this.transformers = [];
if (transformer1 != undefined) this.transformers.push(transformer1);
if (transformer2 != undefined) this.transformers.push(transformer2);
if (transformer3 != undefined) this.transformers.push(transformer3);
}
function MethodTransformer(func, name) {
this.func = func;
this.name = name;
}
function removeBetweenInclusive(instructions, startInstruction, endInstruction) {
var start = instructions.indexOf(startInstruction);
var end = instructions.indexOf(endInstruction);
for (var i = start; i < end; ++i) {
instructions.remove(instructions.get(start));
}
}
var currentlyRunning;
function start(name) {
log("Starting " + name);
currentlyRunning = name;
}
function finish() {
var name = currentlyRunning;
currentlyRunning = undefined;
log("Finished " + name);
}
function log(msg) {
if (currentlyRunning == undefined) {
print("["+transformerName+"]: " + msg);
} else {
print("["+transformerName+"] [" + currentlyRunning + "]: " + msg);
}
}
function mapMethod(srgName) {
return ASMAPI.mapMethod(srgName);
}
function mapField(srgName) {
return ASMAPI.mapField(srgName);
}
var/*Class/Interface*/ Opcodes = Java.type('org.objectweb.asm.Opcodes');
var/*Class*/ MethodNode = Java.type('org.objectweb.asm.tree.MethodNode');
var/*Class*/ MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode');
var/*Class*/ InsnNode = Java.type('org.objectweb.asm.tree.InsnNode');
var/*Class*/ VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode');
var/*Class*/ AbstractInsnNode = Java.type('org.objectweb.asm.tree.AbstractInsnNode');
var/*Class*/ JumpInsnNode = Java.type('org.objectweb.asm.tree.JumpInsnNode');
var/*Class*/ LabelNode = Java.type('org.objectweb.asm.tree.LabelNode');
var/*Class*/ TypeInsnNode = Java.type('org.objectweb.asm.tree.TypeInsnNode');
var/*Class*/ FieldInsnNode = Java.type('org.objectweb.asm.tree.FieldInsnNode');
var/*Class*/ FieldNode = Java.type('org.objectweb.asm.tree.FieldNode');
var/*Class*/ InsnList = Java.type('org.objectweb.asm.tree.InsnList');
var/*Class*/ ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI');
// Opcodes
// Access flags values, defined in
// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.1-200-E.1
// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.5-200-A.1
// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.6-200-A.1
// - https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.25
var ACC_PUBLIC = Opcodes.ACC_PUBLIC; // class, field, method
var ACC_PRIVATE = Opcodes.ACC_PRIVATE; // class, field, method
var ACC_PROTECTED = Opcodes.ACC_PROTECTED; // class, field, method
var ACC_STATIC = Opcodes.ACC_STATIC; // field, method
var ACC_FINAL = Opcodes.ACC_FINAL; // class, field, method, parameter
var ACC_SUPER = Opcodes.ACC_SUPER; // class
var ACC_SYNCHRONIZED = Opcodes.ACC_SYNCHRONIZED; // method
var ACC_OPEN = Opcodes.ACC_OPEN; // module
var ACC_TRANSITIVE = Opcodes.ACC_TRANSITIVE; // module requires
var ACC_VOLATILE = Opcodes.ACC_VOLATILE; // field
var ACC_BRIDGE = Opcodes.ACC_BRIDGE; // method
var ACC_STATIC_PHASE = Opcodes.ACC_STATIC_PHASE; // module requires
var ACC_VARARGS = Opcodes.ACC_VARARGS; // method
var ACC_TRANSIENT = Opcodes.ACC_TRANSIENT; // field
var ACC_NATIVE = Opcodes.ACC_NATIVE; // method
var ACC_INTERFACE = Opcodes.ACC_INTERFACE; // class
var ACC_ABSTRACT = Opcodes.ACC_ABSTRACT; // class, method
var ACC_STRICT = Opcodes.ACC_STRICT; // method
var ACC_SYNTHETIC = Opcodes.ACC_SYNTHETIC; // class, field, method, parameter, module *
var ACC_ANNOTATION = Opcodes.ACC_ANNOTATION; // class
var ACC_ENUM = Opcodes.ACC_ENUM; // class(?) field inner
var ACC_MANDATED = Opcodes.ACC_MANDATED; // parameter, module, module *
var ACC_MODULE = Opcodes.ACC_MODULE; // class
// ASM specific access flags.
// WARNING: the 16 least significant bits must NOT be used, to avoid conflicts with standard
// access flags, and also to make sure that these flags are automatically filtered out when
// written in class files (because access flags are stored using 16 bits only).
var ACC_DEPRECATED = Opcodes.ACC_DEPRECATED; // class, field, method
// Possible values for the type operand of the NEWARRAY instruction.
// See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-6.html#jvms-6.5.newarray.
var T_BOOLEAN = Opcodes.T_BOOLEAN;
var T_CHAR = Opcodes.T_CHAR;
var T_FLOAT = Opcodes.T_FLOAT;
var T_DOUBLE = Opcodes.T_DOUBLE;
var T_BYTE = Opcodes.T_BYTE;
var T_SHORT = Opcodes.T_SHORT;
var T_INT = Opcodes.T_INT;
var T_LONG = Opcodes.T_LONG;
// Possible values for the reference_kind field of CONSTANT_MethodHandle_info structures.
// See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.4.8.
var H_GETFIELD = Opcodes.H_GETFIELD;
var H_GETSTATIC = Opcodes.H_GETSTATIC;
var H_PUTFIELD = Opcodes.H_PUTFIELD;
var H_PUTSTATIC = Opcodes.H_PUTSTATIC;
var H_INVOKEVIRTUAL = Opcodes.H_INVOKEVIRTUAL;
var H_INVOKESTATIC = Opcodes.H_INVOKESTATIC;
var H_INVOKESPECIAL = Opcodes.H_INVOKESPECIAL;
var H_NEWINVOKESPECIAL = Opcodes.H_NEWINVOKESPECIAL;
var H_INVOKEINTERFACE = Opcodes.H_INVOKEINTERFACE;
// ASM specific stack map frame types, used in {@link ClassVisitor#visitFrame}.
/** An expanded frame. See {@link ClassReader#EXPAND_FRAMES}. */
var F_NEW = Opcodes.F_NEW;
/** A compressed frame with complete frame data. */
var F_FULL = Opcodes.F_FULL;
/**
* A compressed frame where locals are the same as the locals in the previous frame, except that
* additional 1-3 locals are defined, and with an empty stack.
*/
var F_APPEND = Opcodes.F_APPEND;
/**
* A compressed frame where locals are the same as the locals in the previous frame, except that
* the last 1-3 locals are absent and with an empty stack.
*/
var F_CHOP = Opcodes.F_CHOP;
/**
* A compressed frame with exactly the same locals as the previous frame and with an empty stack.
*/
var F_SAME = Opcodes.F_SAME;
/**
* A compressed frame with exactly the same locals as the previous frame and with a single value
* on the stack.
*/
var F_SAME1 = Opcodes.F_SAME1;
// The JVM opcode values (with the MethodVisitor method name used to visit them in comment, and
// where '-' means 'same method name as on the previous line').
// See https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-6.html.
var NOP = Opcodes.NOP; // visitInsn
var ACONST_NULL = Opcodes.ACONST_NULL; // -
var ICONST_M1 = Opcodes.ICONST_M1; // -
var ICONST_0 = Opcodes.ICONST_0; // -
var ICONST_1 = Opcodes.ICONST_1; // -
var ICONST_2 = Opcodes.ICONST_2; // -
var ICONST_3 = Opcodes.ICONST_3; // -
var ICONST_4 = Opcodes.ICONST_4; // -
var ICONST_5 = Opcodes.ICONST_5; // -
var LCONST_0 = Opcodes.LCONST_0; // -
var LCONST_1 = Opcodes.LCONST_1; // -
var FCONST_0 = Opcodes.FCONST_0; // -
var FCONST_1 = Opcodes.FCONST_1; // -
var FCONST_2 = Opcodes.FCONST_2; // -
var DCONST_0 = Opcodes.DCONST_0; // -
var DCONST_1 = Opcodes.DCONST_1; // -
var BIPUSH = Opcodes.BIPUSH; // visitIntInsn
var SIPUSH = Opcodes.SIPUSH; // -
var LDC = Opcodes.LDC; // visitLdcInsn
var ILOAD = Opcodes.ILOAD; // visitVarInsn
var LLOAD = Opcodes.LLOAD; // -
var FLOAD = Opcodes.FLOAD; // -
var DLOAD = Opcodes.DLOAD; // -
var ALOAD = Opcodes.ALOAD; // -
var IALOAD = Opcodes.IALOAD; // visitInsn
var LALOAD = Opcodes.LALOAD; // -
var FALOAD = Opcodes.FALOAD; // -
var DALOAD = Opcodes.DALOAD; // -
var AALOAD = Opcodes.AALOAD; // -
var BALOAD = Opcodes.BALOAD; // -
var CALOAD = Opcodes.CALOAD; // -
var SALOAD = Opcodes.SALOAD; // -
var ISTORE = Opcodes.ISTORE; // visitVarInsn
var LSTORE = Opcodes.LSTORE; // -
var FSTORE = Opcodes.FSTORE; // -
var DSTORE = Opcodes.DSTORE; // -
var ASTORE = Opcodes.ASTORE; // -
var IASTORE = Opcodes.IASTORE; // visitInsn
var LASTORE = Opcodes.LASTORE; // -
var FASTORE = Opcodes.FASTORE; // -
var DASTORE = Opcodes.DASTORE; // -
var AASTORE = Opcodes.AASTORE; // -
var BASTORE = Opcodes.BASTORE; // -
var CASTORE = Opcodes.CASTORE; // -
var SASTORE = Opcodes.SASTORE; // -
var POP = Opcodes.POP; // -
var POP2 = Opcodes.POP2; // -
var DUP = Opcodes.DUP; // -
var DUP_X1 = Opcodes.DUP_X1; // -
var DUP_X2 = Opcodes.DUP_X2; // -
var DUP2 = Opcodes.DUP2; // -
var DUP2_X1 = Opcodes.DUP2_X1; // -
var DUP2_X2 = Opcodes.DUP2_X2; // -
var SWAP = Opcodes.SWAP; // -
var IADD = Opcodes.IADD; // -
var LADD = Opcodes.LADD; // -
var FADD = Opcodes.FADD; // -
var DADD = Opcodes.DADD; // -
var ISUB = Opcodes.ISUB; // -
var LSUB = Opcodes.LSUB; // -
var FSUB = Opcodes.FSUB; // -
var DSUB = Opcodes.DSUB; // -
var IMUL = Opcodes.IMUL; // -
var LMUL = Opcodes.LMUL; // -
var FMUL = Opcodes.FMUL; // -
var DMUL = Opcodes.DMUL; // -
var IDIV = Opcodes.IDIV; // -
var LDIV = Opcodes.LDIV; // -
var FDIV = Opcodes.FDIV; // -
var DDIV = Opcodes.DDIV; // -
var IREM = Opcodes.IREM; // -
var LREM = Opcodes.LREM; // -
var FREM = Opcodes.FREM; // -
var DREM = Opcodes.DREM; // -
var INEG = Opcodes.INEG; // -
var LNEG = Opcodes.LNEG; // -
var FNEG = Opcodes.FNEG; // -
var DNEG = Opcodes.DNEG; // -
var ISHL = Opcodes.ISHL; // -
var LSHL = Opcodes.LSHL; // -
var ISHR = Opcodes.ISHR; // -
var LSHR = Opcodes.LSHR; // -
var IUSHR = Opcodes.IUSHR; // -
var LUSHR = Opcodes.LUSHR; // -
var IAND = Opcodes.IAND; // -
var LAND = Opcodes.LAND; // -
var IOR = Opcodes.IOR; // -
var LOR = Opcodes.LOR; // -
var IXOR = Opcodes.IXOR; // -
var LXOR = Opcodes.LXOR; // -
var IINC = Opcodes.IINC; // visitIincInsn
var I2L = Opcodes.I2L; // visitInsn
var I2F = Opcodes.I2F; // -
var I2D = Opcodes.I2D; // -
var L2I = Opcodes.L2I; // -
var L2F = Opcodes.L2F; // -
var L2D = Opcodes.L2D; // -
var F2I = Opcodes.F2I; // -
var F2L = Opcodes.F2L; // -
var F2D = Opcodes.F2D; // -
var D2I = Opcodes.D2I; // -
var D2L = Opcodes.D2L; // -
var D2F = Opcodes.D2F; // -
var I2B = Opcodes.I2B; // -
var I2C = Opcodes.I2C; // -
var I2S = Opcodes.I2S; // -
var LCMP = Opcodes.LCMP; // -
var FCMPL = Opcodes.FCMPL; // -
var FCMPG = Opcodes.FCMPG; // -
var DCMPL = Opcodes.DCMPL; // -
var DCMPG = Opcodes.DCMPG; // -
var IFEQ = Opcodes.IFEQ; // visitJumpInsn
var IFNE = Opcodes.IFNE; // -
var IFLT = Opcodes.IFLT; // -
var IFGE = Opcodes.IFGE; // -
var IFGT = Opcodes.IFGT; // -
var IFLE = Opcodes.IFLE; // -
var IF_ICMPEQ = Opcodes.IF_ICMPEQ; // -
var IF_ICMPNE = Opcodes.IF_ICMPNE; // -
var IF_ICMPLT = Opcodes.IF_ICMPLT; // -
var IF_ICMPGE = Opcodes.IF_ICMPGE; // -
var IF_ICMPGT = Opcodes.IF_ICMPGT; // -
var IF_ICMPLE = Opcodes.IF_ICMPLE; // -
var IF_ACMPEQ = Opcodes.IF_ACMPEQ; // -
var IF_ACMPNE = Opcodes.IF_ACMPNE; // -
var GOTO = Opcodes.GOTO; // -
var JSR = Opcodes.JSR; // -
var RET = Opcodes.RET; // visitVarInsn
var TABLESWITCH = Opcodes.TABLESWITCH; // visiTableSwitchInsn
var LOOKUPSWITCH = Opcodes.LOOKUPSWITCH; // visitLookupSwitch
var IRETURN = Opcodes.IRETURN; // visitInsn
var LRETURN = Opcodes.LRETURN; // -
var FRETURN = Opcodes.FRETURN; // -
var DRETURN = Opcodes.DRETURN; // -
var ARETURN = Opcodes.ARETURN; // -
var RETURN = Opcodes.RETURN; // -
var GETSTATIC = Opcodes.GETSTATIC; // visitFieldInsn
var PUTSTATIC = Opcodes.PUTSTATIC; // -
var GETFIELD = Opcodes.GETFIELD; // -
var PUTFIELD = Opcodes.PUTFIELD; // -
var INVOKEVIRTUAL = Opcodes.INVOKEVIRTUAL; // visitMethodInsn
var INVOKESPECIAL = Opcodes.INVOKESPECIAL; // -
var INVOKESTATIC = Opcodes.INVOKESTATIC; // -
var INVOKEINTERFACE = Opcodes.INVOKEINTERFACE; // -
var INVOKEDYNAMIC = Opcodes.INVOKEDYNAMIC; // visitInvokeDynamicInsn
var NEW = Opcodes.NEW; // visitTypeInsn
var NEWARRAY = Opcodes.NEWARRAY; // visitIntInsn
var ANEWARRAY = Opcodes.ANEWARRAY; // visitTypeInsn
var ARRAYLENGTH = Opcodes.ARRAYLENGTH; // visitInsn
var ATHROW = Opcodes.ATHROW; // -
var CHECKCAST = Opcodes.CHECKCAST; // visitTypeInsn
var INSTANCEOF = Opcodes.INSTANCEOF; // -
var MONITORENTER = Opcodes.MONITORENTER; // visitInsn
var MONITOREXIT = Opcodes.MONITOREXIT; // -
var MULTIANEWARRAY = Opcodes.MULTIANEWARRAY; // visitMultiANewArrayInsn
var IFNULL = Opcodes.IFNULL; // visitJumpInsn
var IFNONNULL = Opcodes.IFNONNULL; // -
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment