89 lines
3.3 KiB
Java
89 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;
|
|
|
|
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<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 "";
|
|
}
|
|
}
|
|
}
|