package com.w67clement.mineapi.nms.reflection.packets.play.in;
import com.w67clement.mineapi.entity.player.ClientCommand;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.bukkit.entity.Player;
import static com.w67clement.mineapi.api.ReflectionAPI.*;
/**
* Created by w67clement on 15/03/2016.
* <p>
* Class of project: MineAPI
*/
public class CraftClientCommand extends ClientCommand<Object>
{
private static final Class<?> packetClass;
private static final Field enumClientCommandField;
private static final Class<?> enumClientCommand;
private static final Method nameMethod;
private static final Method valueOfMethod;
static
{
packetClass = getNmsClass("PacketPlayInClientCommand");
enumClientCommand = NmsClass.getEnumClientCommandClass();
enumClientCommandField = getFirstFieldOfType(packetClass, enumClientCommand, true);
nameMethod = getMethod(enumClientCommand, "name");
valueOfMethod = getMethod(enumClientCommand, "valueOf", String.class);
}
public CraftClientCommand(Object packet) {
super(packet);
}
public CraftClientCommand(ClientCommandType type)
{
super(SunUnsafe.newInstance(packetClass));
this.setClientCommandType(type);
}
@Override
public void send(Player player)
{
NmsClass.sendPacket(player, getHandle());
}
@Override
public ClientCommand setClientCommandType(ClientCommandType type)
{
Object clientCommand = invokeMethod(null, valueOfMethod, type.name());
setValue(packet, enumClientCommandField, clientCommand);
return this;
}
@Override
public ClientCommandType getClientCommandType()
{
String clientCommandType = invokeMethodWithType(getValue(packet, enumClientCommandField), nameMethod, String.class);
return ClientCommandType.valueOf(clientCommandType);
}
}