package at.er.ytbattle.util.timer; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class TimerManager { private HashMap<Object, HashMap<Object, Timeable>> timers; public TimerManager() { this.timers = new HashMap<>(); } public void registerTimer(Timeable timer) { timer.setTimerManager(this); this.getTimers(timer.getManagerIdentifier()).put(timer.getIdentifier(), timer); } public void unregisterTimer(Timeable timer) { this.getTimers(timer.getManagerIdentifier()).remove(timer.getIdentifier()); } public Timeable getTimer(Object managerIdentifier, Object identifier) { return this.getTimers(managerIdentifier).get(identifier); } public boolean hasTimer(Object managerIdentifier, Object identifier) { return this.getTimers(managerIdentifier).containsKey(identifier); } public boolean hasTimer(Object managerIdentifier, Timeable timeable) { return this.getTimers(managerIdentifier).containsValue(timeable); } public void removeTimer(Object managerIdentifier, Object identifier) { Timeable t = this.getTimer(managerIdentifier, identifier); if (t != null) { t.removeTimer(); } } public int getSize(Object managerIdentifier) { return this.getTimers(managerIdentifier).size(); } public Timeable findLongestRunningTimer(Object managerIdentifier) { long ref = 0; Timeable longestRunning = null; for (Timeable timeable : this.getTimersAsList(managerIdentifier)) { if (timeable.getElapsedTime() >= ref) { longestRunning = timeable; ref = timeable.getElapsedTime(); } } return longestRunning; } public ArrayList<Timeable> getAllTimers() { ArrayList<Timeable> timerlist = new ArrayList<>(); for (Map.Entry<Object, HashMap<Object, Timeable>> entry1 : this.timers.entrySet()) { for (Map.Entry<Object, Timeable> entry2 : entry1.getValue().entrySet()) { timerlist.add(entry2.getValue()); } } return timerlist; } public HashMap<Object, Timeable> getTimers(Object managerIdentifier) { HashMap<Object, Timeable> hs = this.timers.get(managerIdentifier); if (hs == null) { this.timers.put(managerIdentifier, new HashMap<Object, Timeable>()); } return this.timers.get(managerIdentifier); } public ArrayList<Timeable> getTimersAsList(Object managerIdentifier) { ArrayList<Timeable> timerlist = new ArrayList<>(); HashMap<Object, Timeable> hs = this.timers.get(managerIdentifier); if (hs == null) { this.timers.put(managerIdentifier, new HashMap<Object, Timeable>()); } else { for (Map.Entry<Object, Timeable> entry : hs.entrySet()) { timerlist.add(entry.getValue()); } } return timerlist; } public void startAllTimers() { for (Timeable timeable : this.getAllTimers()) { timeable.startTimer(); } } public void startTimers(Object managerIdentifier) { for (Timeable timeable : this.getTimersAsList(managerIdentifier)) { timeable.startTimer(); } } public void stopAllTimers() { for (Timeable timeable : this.getAllTimers()) { timeable.stopTimer(); } } public void stopTimers(Object managerIdentifier) { for (Timeable timeable : this.getTimersAsList(managerIdentifier)) { timeable.stopTimer(); } } public void pauseAllTimers() { for (Timeable timeable : this.getAllTimers()) { timeable.pauseTimer(); } } public void pauseTimers(Object managerIdentifier) { for (Timeable timeable : this.getTimersAsList(managerIdentifier)) { timeable.pauseTimer(); } } public void resumeAllTimers() { for (Timeable timeable : this.getAllTimers()) { timeable.resumeTimer(); } } public void resumeTimers(Object managerIdentifier) { for (Timeable timeable : this.getTimersAsList(managerIdentifier)) { timeable.resumeTimer(); } } public void removeAllTimers() { for (Timeable timeable : this.getAllTimers()) { timeable.removeTimer(); } } public void removeTimers(Object managerIdentifier) { for (Timeable timeable : this.getTimersAsList(managerIdentifier)) { timeable.removeTimer(); } } public enum TimeScale { GAMETICK(1), REDSTONETICK(2), SECOND(20), MINUTE(1200); private int multiplier; TimeScale(int multiplier) { this.multiplier = multiplier; } public int getMultiplier() { return this.multiplier; } } }