package eu.mikroskeem.utils.bukkit; import eu.mikroskeem.utils.reflect.Reflect; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; import org.bukkit.plugin.java.PluginClassLoader; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Map; import static com.google.common.base.Preconditions.checkNotNull; public class ServerUtils { /** * Get server's TPS * * Will use PaperSpigot's API if available, reflection otherwise * @return double array of TPS (not rounded!), values are -1 if reflection failed */ public static double[] getTPS(){ if(Reflect.getMethod(Bukkit.class, "getTps") != null) { return Bukkit.getTPS(); } else { try { Class MinecraftServerClass = checkNotNull(Reflect.getClass( String.format("net.minecraft.server.%s.MinecraftServer", getNmsVersion()))); Method getServer = checkNotNull(Reflect.getMethod(MinecraftServerClass, "getServer")); Field recentTPS = checkNotNull(Reflect.getField(MinecraftServerClass, "recentTps")); Object server = checkNotNull(Reflect.invokeMethod(getServer, null)); return (double[]) checkNotNull(Reflect.readField(recentTPS, server)); } catch (NullPointerException ignored){} } return new double[]{-1, -1, -1}; } /** * Get plugin class loader. Useful when you want to add new classes on runtime * * @param plugin Plugin which will be used to get plugin ClassLoader * @return Plugin ClassLoader */ @SuppressWarnings("unchecked") public static ClassLoader getPluginClassLoader(JavaPlugin plugin){ JavaPluginLoader pl = (JavaPluginLoader)plugin.getPluginLoader(); Field loadersField = Reflect.getField(pl.getClass(), "loaders"); if(loadersField != null) { List loaders = null; switch (getNmsVersion()){ case "v1_8_R3": case "v1_9_R1": // TODO: Check? case "v1_9_R2": loaders = new ArrayList<>(((Map) Reflect.readField(loadersField, pl)).values()); break; case "v1_10_R1": case "v1_11_R1": loaders = (List) Reflect.readField(loadersField, pl); break; } if(loaders != null) { for(PluginClassLoader loader : loaders) { if(loader.getPlugin().getName().equals(plugin.getName())){ return loader; } } } } return null; } /** * Get NMS version of current running server * @return NMS version or 0 length string */ public static String getNmsVersion(){ try { String bukkitPackageName = Bukkit.getServer().getClass().getPackage().getName(); return bukkitPackageName.substring(bukkitPackageName.lastIndexOf(".") + 1); } catch (NullPointerException e){ return ""; } } }