Utils/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/PlayerUtils.java

39 lines
1.5 KiB
Java

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;
}
}
}