package ender.timer; import haven.Coord; import haven.Label; import haven.UI; import haven.Window; public class Timer { private static final int SERVER_RATIO = 3; public static long server; public static long local; private long start; private long time; private String name; private long seconds; public Callback updcallback; public Timer(long start, long time, String name){ this.start = start; this.time = time; this.name = name; TimerController.getInstance().add(this); } public Timer(long time, String name){ this(0, time, name); } public boolean isWorking(){ return start != 0; } public void stop(){ start = 0; if(updcallback != null){ updcallback.run(this); } TimerController.getInstance().save(); } public void start(){ start = server + SERVER_RATIO*((System.currentTimeMillis()/1000)-local); TimerController.getInstance().save(); } public void start(long start){ this.start = start; } public synchronized boolean update(){ long now = System.currentTimeMillis()/1000; seconds = time - now + local - (server - start)/SERVER_RATIO; if(seconds <= 0){ Window wnd = new Window(new Coord(250,100), Coord.z, UI.instance.root, "Timer"); String str; if(seconds < -60){ str = String.format("%s elapsed since timer named \"%s\" finished it's work", toString(), name); } else { str = String.format("Timer named \"%s\" just finished it's work", name); } new Label(Coord.z, wnd, str); wnd.justclose = true; wnd.pack(); return true; } if(updcallback != null){ updcallback.run(this); } return false; } public synchronized long getStart() { return start; } public synchronized void setStart(long start) { this.start = start; } public synchronized String getName() { return name; } public synchronized void setName(String name) { this.name = name; } public synchronized void setTime(long time) { this.time = time; } public synchronized long getTime() { return time; } @Override public String toString() { long t = Math.abs(isWorking()?seconds:time); int h = (int) (t/3600); int m = (int) ((t%3600)/60); int s = (int) (t%60); return String.format("%d:%02d:%02d", h,m,s); } public void destroy(){ TimerController.getInstance().remove(this); updcallback = null; } }