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

41 lines
1.8 KiB
Java
Raw Normal View History

package eu.mikroskeem.utils.bukkit;
2017-03-22 01:09:03 +02:00
import eu.mikroskeem.shuriken.reflect.Reflect;
import eu.mikroskeem.shuriken.reflect.wrappers.ClassWrapper;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
2017-03-22 01:09:03 +02:00
import java.lang.reflect.InvocationTargetException;
2016-12-22 03:51:43 +02:00
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)
*/
2017-03-22 01:09:03 +02:00
@SuppressWarnings("unchecked")
public static <CraftPlayer, NMSPlayer> int getNMSPing(@NotNull Player player){
2016-12-22 03:51:43 +02:00
try {
String nmsVer = getNmsVersion();
2017-03-22 01:09:03 +02:00
ClassWrapper<CraftPlayer> craftPlayerClass = (ClassWrapper<CraftPlayer>) checkNotNull(Reflect.getClass(
String.format("org.bukkit.craftbukkit.%s.entity.CraftPlayer", nmsVer)).orElse(null))
.setClassInstance(player);
ClassWrapper<NMSPlayer> nmsEntityPlayerClass = (ClassWrapper<NMSPlayer>) checkNotNull(Reflect.getClass(
String.format("net.minecraft.server.%s.EntityPlayer", nmsVer)).orElse(null));
NMSPlayer nmsPlayer = craftPlayerClass
.invokeMethod("getHandle", nmsEntityPlayerClass.getWrappedClass());
nmsEntityPlayerClass.setClassInstance(nmsPlayer);
return checkNotNull(nmsEntityPlayerClass.getField("ping", int.class).orElse(null)).read();
}
2017-03-22 01:09:03 +02:00
catch (NullPointerException|NoSuchFieldException|NoSuchMethodException|
IllegalAccessException|InvocationTargetException ignored){}
return -1;
}
}