package eu.mikroskeem.utils.bukkit; import eu.mikroskeem.utils.reflect.Reflect; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.lang.reflect.Method; 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){ int ping = -1; String bukkitPackageName = Bukkit.getServer().getClass().getPackage().getName(); String nmsVer = bukkitPackageName.substring(bukkitPackageName.lastIndexOf(".") + 1); Class craftPlayerClass = Reflect.getClass( String.format("org.bukkit.craftbukkit.%s.entity.CraftPlayer", nmsVer)); Class craftEntityPlayerClass = Reflect.getClass( String.format("net.minecraft.server.%s.EntityPlayer", nmsVer)); if(craftPlayerClass != null && craftEntityPlayerClass != null){ Method getHandle = Reflect.getMethod(craftPlayerClass, "getHandle"); if(getHandle != null){ Object handle = Reflect.invokeMethod(getHandle, player); if(handle != null){ Field pingField = Reflect.getField(craftEntityPlayerClass, "ping"); if(pingField != null){ Integer nmsPing = (Integer)Reflect.readField(pingField, handle); if(nmsPing != null){ return nmsPing; } } } } } return ping; } }