/*
 * Copyright (C) 2017 - 2019 | Wurst-Imperium | All rights reserved.
 *
 * This source code is subject to the terms of the GNU General Public
 * License, version 3. If a copy of the GPL was not distributed with this
 * file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt
 */
package net.wurstclient.forge.asm;

import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public final class NetHandlerPlayClientVisitor extends WurstClassVisitor
{
	public NetHandlerPlayClientVisitor(ClassVisitor cv, boolean obf)
	{
		super(cv);
		
		String packet = unmap("net/minecraft/network/Packet");
		
		String sendPacket_name = obf ? "a" : "sendPacket";
		String sendPacket_desc = "(L" + packet + ";)V";
		
		registerMethodVisitor(sendPacket_name, sendPacket_desc,
			mv -> new SendPacketVisitor(mv));
	}
	
	private static class SendPacketVisitor extends MethodVisitor
	{
		public SendPacketVisitor(MethodVisitor mv)
		{
			super(Opcodes.ASM4, mv);
		}
		
		@Override
		public void visitCode()
		{
			System.out.println(
				"NetHandlerPlayClientVisitor.SendPacketVisitor.visitCode()");
			
			super.visitCode();
			mv.visitVarInsn(Opcodes.ALOAD, 1);
			mv.visitMethodInsn(Opcodes.INVOKESTATIC,
				"net/wurstclient/forge/compatibility/WEventFactory",
				"onSendPacket",
				"(Lnet/minecraft/network/Packet;)Lnet/minecraft/network/Packet;",
				false);
			mv.visitVarInsn(Opcodes.ASTORE, 1);
			mv.visitVarInsn(Opcodes.ALOAD, 1);
			Label l2 = new Label();
			mv.visitJumpInsn(Opcodes.IFNONNULL, l2);
			mv.visitInsn(Opcodes.RETURN);
			mv.visitLabel(l2);
		}
	}
}