package eu.mikroskeem.utils.bukkit; import eu.mikroskeem.utils.reflect.Reflect; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.lang.reflect.Method; import static com.google.common.base.Preconditions.checkNotNull; import static eu.mikroskeem.utils.bukkit.ServerUtils.getNmsVersion; public class PlayerUtils { /** * Return player ping (via NMS reflection) * * Note: I'm bit disappointed, that Bukkit API doesn't expose method to get player's ping * * @param player Player who ping to query * @return Player's ping (-1 if reflection failed) */ public static int getNMSPing(@NotNull Player player){ try { String nmsVer = getNmsVersion(); Class craftPlayerClass = checkNotNull(Reflect.getClass( String.format("org.bukkit.craftbukkit.%s.entity.CraftPlayer", nmsVer))); Class craftEntityPlayerClass = checkNotNull(Reflect.getClass( String.format("net.minecraft.server.%s.EntityPlayer", nmsVer))); Method getHandle = checkNotNull(Reflect.getMethod(craftPlayerClass, "getHandle")); Object handle = checkNotNull(Reflect.invokeMethod(getHandle, player)); Field pingField = checkNotNull(Reflect.getField(craftEntityPlayerClass, "ping")); return (Integer) checkNotNull(Reflect.readField(pingField, handle)); } catch (NullPointerException ignored){ return -1; } } }