package coloredlightscore.src.asm.transformer; import coloredlightscore.src.asm.transformer.core.ASMUtils; import coloredlightscore.src.asm.transformer.core.MethodTransformer; import coloredlightscore.src.asm.transformer.core.NameMapper; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.*; import static coloredlightscore.src.asm.ColoredLightsCoreDummyContainer.CLLog; public class TransformEntityPlayerMP extends MethodTransformer { private final String CLASSNAME = "net.minecraft.entity.player.EntityPlayerMP"; public TransformEntityPlayerMP() { // TODO Auto-generated constructor stub } @Override protected boolean transforms(ClassNode clazz, MethodNode method) { return NameMapper.getInstance().isMethod(method, CLASSNAME, "onUpdate ()V"); } @Override protected boolean transform(ClassNode clazz, MethodNode method) { if (NameMapper.getInstance().isMethod(method, CLASSNAME, "onUpdate ()V")) { // invokespecial net.minecraft.network.play.server.S26PacketMapChunkBulk(java.util.List) //String S26PacketMapChunkBulk = NameMapper.getInstance().getClassName("net/minecraft/network/play/server/S26PacketMapChunkBulk"); AbstractInsnNode insertionPoint = ASMUtils.findLastInvoke(method, Opcodes.INVOKESPECIAL, "net/minecraft/network/play/server/S26PacketMapChunkBulk", "<init> (Ljava/util/List;)V", false); InsnList helperInvoke = new InsnList(); String helperDescriptor = NameMapper.getInstance().getJVMTypeObfuscated("(Ljava/util/ArrayList;Lnet/minecraft/entity/player/EntityPlayerMP;)V"); // +1 (done later to prevent runtime crash) //insertionPoint = insertionPoint.getNext(); helperInvoke.add(new VarInsnNode(Opcodes.ALOAD, 1)); // array list helperInvoke.add(new VarInsnNode(Opcodes.ALOAD, 0)); // this // Invoke helper function helperInvoke.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "coloredlightscore/server/PlayerManagerHelper", "entityPlayerMP_onUpdate", helperDescriptor)); if (insertionPoint != null) { method.instructions.insert(insertionPoint.getNext(), helperInvoke); return true; } else { CLLog.error("TransformEntityPlayerMP.transform() Could not find INVOKESPECIAL to S26PacketMapChunkBulk constructor!"); ASMUtils.findLastInvoke(method, Opcodes.INVOKESPECIAL, "net/minecraft/network/play/server/S26PacketMapChunkBulk", "<init> (Ljava/util/List;)V", true); } return false; } return false; } @Override protected boolean transforms(String className) { //return className.equals(NameMapper.getInstance().getClassName(CLASSNAME).replace('/', '.')); return className.equals(CLASSNAME); } }