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

91 lines
3.3 KiB
Java

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;
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(Bukkit.getVersion().contains("Paper")) {
return Bukkit.getTPS();
} else {
Class<?> MinecraftServerClass = Reflect.getClass(
String.format("net.minecraft.server.%s.MinecraftServer", getNmsVersion()));
if(MinecraftServerClass != null){
Method getServer = Reflect.getMethod(MinecraftServerClass, "getServer");
Field recentTPS = Reflect.getField(MinecraftServerClass, "recentTps");
if(getServer != null && recentTPS != null){
Object server = Reflect.invokeMethod(getServer, null);
try {
return (double[]) Reflect.readField(recentTPS, server);
} catch (NullPointerException e){}
}
}
}
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<PluginClassLoader> loaders = null;
switch (getNmsVersion()){
case "v1_8_R3":
case "v1_9_R1": // TODO: Check?
case "v1_9_R2":
loaders = new ArrayList<>(((Map<String, PluginClassLoader>)
Reflect.readField(loadersField, pl)).values());
break;
case "v1_10_R1":
case "v1_11_R1":
loaders = (List<PluginClassLoader>) 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 "";
}
}
}