package com.matt.forgehax.asm.patches;

import com.matt.forgehax.asm.TypesHook;
import com.matt.forgehax.asm.utils.ASMHelper;
import com.matt.forgehax.asm.utils.asmtype.ASMMethod;
import com.matt.forgehax.asm.utils.transforming.ClassTransformer;
import com.matt.forgehax.asm.utils.transforming.Inject;
import com.matt.forgehax.asm.utils.transforming.MethodTransformer;
import com.matt.forgehax.asm.utils.transforming.RegisterMethodTransformer;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.VarInsnNode;

/**
 * Created by Babbaj on 8/9/2017.
 */
public class RenderBoatPatch extends ClassTransformer {
  
  public RenderBoatPatch() {
    super(Classes.RenderBoat);
  }
  
  @RegisterMethodTransformer
  private class DoRender extends MethodTransformer {
    
    @Override
    public ASMMethod getMethod() {
      return Methods.RenderBoat_doRender;
    }
    
    @Inject(description = "Add hook to set boat yaw when it's rendered")
    public void inject(MethodNode main) {
      
      InsnList insnList = new InsnList();
      
      insnList.add(new VarInsnNode(ALOAD, 1)); // load the boat entity
      insnList.add(new VarInsnNode(FLOAD, 8)); // load the boat yaw
      insnList.add(
        ASMHelper.call(
          INVOKESTATIC,
          TypesHook.Methods
            .ForgeHaxHooks_onRenderBoat)); // fire the event and get the value(player
      // rotationYaw) returned by the method in
      // ForgeHaxHooks
      insnList.add(new VarInsnNode(FSTORE, 8)); // store it in entityYaw
      
      main.instructions.insert(insnList); // insert code at the top of the method
    }
  }
}