This is not meant to be a tutorial on writing ASM. If you need a tutorial on that, you shouldn’t be reading this.

This is mostly about how to update coremods from 1.12.2 to 1.13.2

This is just a draft of the tutorial, more details will be added soon™️

1) META-INF/coremods.json Example

	"Transformer 1 Name": "path/to/transformer-1.js",
	"Transformer 2 Name": "path/to/transformer-2.js"

2) transformer.js Examples:

3) Basic transformer.js: Target class (at time of writing only classes - not methods or fields - can be targeted) and return class node

function initializeCoreMod() {
	return {
		'coreModName': {
			'target': {
				'type': 'CLASS',
				'name': 'net.minecraft.client.renderer.chunk.RenderChunk'
			'transformer': function(classNode) {
				// Do stuff with classNode
				return classNode;

4) Using Java classes

var Opcodes = Java.type('org.objectweb.asm.Opcodes');
var ASMAPI = Java.type('net.minecraftforge.coremod.api.ASMAPI');

5) Looping over the methods

var methods = classNode.methods;

var targetMethodName = ASMAPI.mapMethod("func_178581_b");
var targetMethodDesc = "(FFFLnet/minecraft/client/renderer/chunk/ChunkRenderTask;)V";

for (var i in methods) {
	var method = methods[i];
	if (! {
		print("Did not match method name " + targetMethodName + " - " +;
	} else if (!method.desc.equals(targetMethodDesc)) {
		print("Did not match method desc " + targetMethodDesc + " - " + method.desc);
	print("Matched method " + + " " + method.desc);

	// Do stuff with method.instructions

	// Break because this particular coremod only targets one method

See allowed classes at net.minecraftforge.coremod.CoreModEngine#ALLOWED_CLASSES
6) ONLY FOR FORGE <199! Use ASMAPI.getMethodNode().instructions to get a blank InsnList because it’s not an allowed class for some reason (at the time of writing this, check here for whether this is still the case).
7) Loop instructions

var arrayLength = instructions.size();
for (var i = 0; i < arrayLength; ++i) {
	var instruction = instructions.get(i);
	// Do stuff with instruction

8) Debugging
If the coremod has syntax errors or something check the very top of your log (before anything like Scanning Mod File: appears). This is at the very top and is usually to high up for IntelliJ’s console to catch it so use the log in /run/logs/.
If the coremod failed to transform properly search for <eval> and/or XFORM in the log. This will be wherever the class gets initialised so probably towards the end.