49 lines
1.8 KiB
Java
49 lines
1.8 KiB
Java
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;
|
|
}
|
|
}
|