package com.w67clement.mineapi.nms.reflection.packets.play.out;
import com.w67clement.mineapi.MineAPI;
import com.w67clement.mineapi.api.ReflectionAPI.*;
import com.w67clement.mineapi.api.wrappers.ChatComponentWrapper;
import com.w67clement.mineapi.tab.PacketPlayerInfo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.entity.Player;
import static com.w67clement.mineapi.api.ReflectionAPI.*;
public class CraftPacketPlayerInfo extends PacketPlayerInfo<Object>
{
private static final Class<?> packetClass;
private static final Field actionField;
private static final Field dataField;
private static final Class<?> enumPlayerInfoActionClass;
private static final Method valueOfMethod;
private static final Method nameMethod;
private static Class<?> playerDataClass;
private static Constructor<?> playerDataConstructor;
private static Class<?> enum_game_modeClass;
private static Object enum_adventure;
private static Object enum_creative;
private static Object enum_spectator;
private static Object enum_survival;
static
{
packetClass = getNmsClass("PacketPlayOutPlayerInfo");
actionField = getField(packetClass, "a", true);
dataField = getField(packetClass, "b", true);
if (MineAPI.getServerVersion().equals("v1_8_R1"))
playerDataClass = getNmsClass("PlayerInfoData");
else
playerDataClass = getNmsClass("PacketPlayOutPlayerInfo$PlayerInfoData");
if (MineAPI.getServerVersion().equals("v1_8_R1"))
enumPlayerInfoActionClass = getNmsClass("EnumPlayerInfoAction");
else
enumPlayerInfoActionClass = getNmsClass("PacketPlayOutPlayerInfo$EnumPlayerInfoAction");
valueOfMethod = getMethod(enumPlayerInfoActionClass, "valueOf", String.class);
nameMethod = getMethod(enumPlayerInfoActionClass, "name");
if (MineAPI.getServerVersion().equals("v1_8_R1"))
enum_game_modeClass = getNmsClass("EnumGamemode");
else
enum_game_modeClass = getNmsClass("WorldSettings$EnumGamemode");
for (Object obj : enum_game_modeClass.getEnumConstants())
{
if (obj.toString().equals("ADVENTURE"))
{
enum_adventure = obj;
}
else if (obj.toString().equals("CREATIVE"))
{
enum_creative = obj;
}
else if (obj.toString().equals("SPECTATOR"))
{
enum_spectator = obj;
}
else if (obj.toString().equals("SURVIVAL"))
{
enum_survival = obj;
}
}
playerDataConstructor = playerDataClass.getConstructors()[0];
}
public CraftPacketPlayerInfo(Object packet)
{
super(packet);
}
public CraftPacketPlayerInfo(MC_EnumPlayerInfoAction action, List<PacketPlayerInfoData> data)
{
super(SunUnsafe.newInstance(packetClass));
}
@Override
public MC_EnumPlayerInfoAction getAction()
{
String enumPlayerInfoAction = invokeMethodWithType(getValue(packet, actionField), nameMethod, String.class);
return MC_EnumPlayerInfoAction.valueOf(enumPlayerInfoAction);
}
@Override
public void setAction(MC_EnumPlayerInfoAction action)
{
Object clientCommand = invokeMethod(null, valueOfMethod, action.name());
setValue(packet, actionField, clientCommand);
}
@Override
public List<PacketPlayerInfoData> getData()
{
return null;
}
@Override
public void setData(List<PacketPlayerInfoData> data)
{
List<Object> nmsData = new ArrayList<>();
data.forEach(playerinfodata -> {
Object gamemode = null;
switch (playerinfodata.getGamemode())
{
case ADVENTURE:
gamemode = enum_adventure;
break;
case CREATIVE:
gamemode = enum_creative;
break;
case SPECTATOR:
gamemode = enum_spectator;
break;
case SURVIVAL:
gamemode = enum_survival;
break;
default:
break;
}
nmsData.add(newInstance(playerDataConstructor, packet, playerinfodata.getProfile().toNms(), playerinfodata.getPing(), gamemode, ChatComponentWrapper.makeChatComponentByText(playerinfodata.getPlayerListName())));
});
setValue(packet, dataField, data);
}
@Override
public void send(Player player)
{
NmsClass.sendPacket(player, this.getHandle());
}
@SuppressWarnings({"unchecked", "rawtypes"})
private Object constructPacket_Bukkit()
{
List data = new ArrayList();
this.data.forEach(playerinfodata -> {
Object gamemode = null;
switch (playerinfodata.getGamemode())
{
case ADVENTURE:
gamemode = enum_adventure;
break;
case CREATIVE:
gamemode = enum_creative;
break;
case SPECTATOR:
gamemode = enum_spectator;
break;
case SURVIVAL:
gamemode = enum_survival;
break;
default:
break;
}
data.add(newInstance(playerDataConstructor, packet, playerinfodata.getProfile().toNms(), playerinfodata.getPing(), gamemode, ChatComponentWrapper.makeChatComponentByText(playerinfodata.getPlayerListName())));
});
setValue(packet, getField(packetClass, "b", true), data);
return packet;
}
}