package com.alecgorge.minecraft.jsonapi.util;
import org.bukkit.World;
import org.bukkit.plugin.java.JavaPlugin;
import org.json.simpleForBukkit.JSONObject;
public class TickRateCounter {
volatile int expectedTicks;
volatile int elapsedTicks;
volatile double clockRate;
double expectedClockRate = 20.0;
volatile long expectedTime;
volatile long elapsedTime;
volatile double error;
int expectedSecs = 30;
long start;
long startTicks;
World world;
int task;
JavaPlugin plugin;
public TickRateCounter(JavaPlugin plugin) {
this.plugin = plugin;
world = (World)plugin.getServer().getWorlds().get(0);
setBaseline();
task = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new TickRateRepeater(), expectedTicks, expectedTicks);
}
public void cancel() {
plugin.getServer().getScheduler().cancelTask(task);
}
class TickRateRepeater implements Runnable {
@Override
public void run() {
long now = System.currentTimeMillis();
long nowTicks = world.getFullTime();
elapsedTime = now - start;
double elapsedSecs = elapsedTime / 1000.0;
elapsedTicks = (int) (nowTicks - startTicks);
error = (expectedTime - elapsedTime) / elapsedTime * 100;
clockRate = elapsedTicks / elapsedSecs;
setBaseline();
}
}
void setBaseline() {
expectedTime = expectedSecs * 1000;
expectedTicks = 20 * expectedSecs;
start = System.currentTimeMillis();
startTicks = world.getFullTime();
}
public JSONObject getJSONObject() {
JSONObject o = new JSONObject();
o.put("expectedTicks", expectedTicks);
o.put("elapsedTicks", elapsedTicks);
o.put("clockRate", clockRate);
o.put("expectedClockRate", expectedClockRate);
o.put("expectedTime", expectedTime);
o.put("elapsedTime", elapsedTime);
o.put("error", error);
return o;
}
public int getExpectedTicks() {
return expectedTicks;
}
public int getElapsedTicks() {
return elapsedTicks;
}
public double getClockRate() {
return clockRate;
}
public double getExpectedClockRate() {
return expectedClockRate;
}
public long getExpectedTime() {
return expectedTime;
}
public long getElapsedTime() {
return elapsedTime;
}
public double getError() {
return error;
}
}