From 3532c91731f0291b7ff27f3b54b9c4d5b03c6d80 Mon Sep 17 00:00:00 2001 From: Mark Vainomaa Date: Sun, 25 Sep 2016 15:08:16 +0300 Subject: [PATCH] Add method to get server TPS --- BukkitUtils/pom.xml | 11 ++++++ .../mikroskeem/utils/bukkit/ServerUtils.java | 38 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java diff --git a/BukkitUtils/pom.xml b/BukkitUtils/pom.xml index 33af7bd..10eb963 100644 --- a/BukkitUtils/pom.xml +++ b/BukkitUtils/pom.xml @@ -10,8 +10,13 @@ 4.0.0 bukkitutils + 1.1-SNAPSHOT + + destroystokyo-repo + https://repo.destroystokyo.com/repository/maven-public// + spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -24,6 +29,12 @@ reflect 1.0-SNAPSHOT + + com.destroystokyo.paper + paper-api + 1.10.2-R0.1-SNAPSHOT + provided + org.bukkit bukkit diff --git a/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java b/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java new file mode 100644 index 0000000..72ee69b --- /dev/null +++ b/BukkitUtils/src/main/java/eu/mikroskeem/utils/bukkit/ServerUtils.java @@ -0,0 +1,38 @@ +package eu.mikroskeem.utils.bukkit; + +import eu.mikroskeem.utils.reflect.Reflect; +import org.bukkit.Bukkit; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +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 { + String bukkitPackageName = Bukkit.getServer().getClass().getPackage().getName(); + String nmsVer = bukkitPackageName.substring(bukkitPackageName.lastIndexOf(".") + 1); + + Class MinecraftServerClass = Reflect.getClass( + String.format("net.minecraft.server.%s.MinecraftServer", nmsVer)); + 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}; + } +}