diff --git a/src/es/mesacarlos/webconsole/WebConsole.java b/src/es/mesacarlos/webconsole/WebConsole.java index 1bccafb..36c94b0 100644 --- a/src/es/mesacarlos/webconsole/WebConsole.java +++ b/src/es/mesacarlos/webconsole/WebConsole.java @@ -9,6 +9,7 @@ import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManagerFactory; +import es.mesacarlos.webconsole.util.TpsTracker; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.Filter; import org.bukkit.Bukkit; @@ -28,6 +29,7 @@ public class WebConsole extends JavaPlugin { @Override public void onEnable() { + Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new TpsTracker(), 100L, 1L); //Change language to user-specified language. Internationalization.setCurrentLocale(ConfigManager.getInstance().getLanguage()); @@ -100,4 +102,4 @@ public class WebConsole extends JavaPlugin { public WSServer getWSServer() { return server; } -} \ No newline at end of file +} diff --git a/src/es/mesacarlos/webconsole/util/TpsTracker.java b/src/es/mesacarlos/webconsole/util/TpsTracker.java new file mode 100644 index 0000000..e460efe --- /dev/null +++ b/src/es/mesacarlos/webconsole/util/TpsTracker.java @@ -0,0 +1,34 @@ +package es.mesacarlos.webconsole.util; + +public class TpsTracker implements Runnable { + public static int TICK_COUNT = 0; + public static long[] TICKS = new long[600]; + public static long LAST_TICK = 0L; + + public static double getTPS() { + return getTPS(100); + } + + public static double getTPS(int ticks) { + if (TICK_COUNT < ticks) { + return 20.0; + } else { + int target = (TICK_COUNT - 1 - ticks) % TICKS.length; + long elapsed = System.currentTimeMillis() - TICKS[target]; + return (double)ticks / ((double)elapsed / 1000.0); + } + } + + public static long getElapsed(int tickID) { + if (TICK_COUNT - tickID >= TICKS.length) { + } + + long time = TICKS[tickID % TICKS.length]; + return System.currentTimeMillis() - time; + } + + public void run() { + TICKS[TICK_COUNT % TICKS.length] = System.currentTimeMillis(); + ++TICK_COUNT; + } +} diff --git a/src/es/mesacarlos/webconsole/websocket/command/TpsCommand.java b/src/es/mesacarlos/webconsole/websocket/command/TpsCommand.java index 5b9247b..84468f5 100644 --- a/src/es/mesacarlos/webconsole/websocket/command/TpsCommand.java +++ b/src/es/mesacarlos/webconsole/websocket/command/TpsCommand.java @@ -9,6 +9,7 @@ package es.mesacarlos.webconsole.websocket.command; //------------------------------ import es.mesacarlos.webconsole.util.Internationalization; +import es.mesacarlos.webconsole.util.TpsTracker; import es.mesacarlos.webconsole.websocket.WSServer; import es.mesacarlos.webconsole.websocket.response.Tps; import org.java_websocket.WebSocket; @@ -35,20 +36,7 @@ public class TpsCommand implements WSCommand { * @return Current server Tps */ public double[] getTps() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException { - try { - Class minecraftServerClass = Class.forName("net.minecraft.server." + mcVer + ".MinecraftServer"); - Method getServerMethod = minecraftServerClass.getDeclaredMethod("getServer"); - Object serverInstance = getServerMethod.invoke(null); - Field recentTpsField = serverInstance.getClass().getField("recentTps"); - double[] recentTps = (double[]) recentTpsField.get(serverInstance); - for (int i = 0; i < recentTps.length; i++) { - recentTps[i] = Math.round(recentTps[i]); - } - return recentTps; - } catch (Exception e) { - //If an uncaught exception is thrown, maybe it is because this method of getting TPS does not work in the MV version currently running.. - return new double[] { 0 }; - } + return new double[] { Math.round(TpsTracker.getTPS()) }; // rounding elsewe would get something like 19.93620414673046 / 20 tps } }