Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class BoardImpl implements Board {//Runnable, AutoCloseable
- private static final Cleaner cleaner = Cleaner.create();
- //Задач > 16 быть не может!(дефолт капасити - 16, но поставил для справки)
- private final PriorityQueue<BoardTask> tasksQueue = new PriorityQueue<>(16,
- Comparator.comparingLong(BoardTask::getNextRun)
- );
- private final Map<Integer, String> scores = new HashMap<>(16);
- private final Scoreboard board;
- private final Objective objective;
- private final Cleaner.Cleanable cleanable;
- public BoardImpl(String displayName) {
- this.board = Objects.requireNonNull(Bukkit.getScoreboardManager()).getNewScoreboard();
- this.objective = board.registerNewObjective("test", "dummy", displayName);
- this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
- this.cleanable = cleaner.register(this, () -> {
- tasksQueue.clear();//Удаляем задачи
- scores.clear();//Хз, на всякий случай
- });
- }
- /*@Override
- protected void finalize() {
- tasksQueue.clear();
- }*/
- @Override
- public void setDisplayName(String displayName) {
- this.objective.setDisplayName(displayName);
- }
- @Override
- public Board insertScore(int score, String entry) {
- scores.compute(score, (integer, line) -> {
- if(line != null) {
- board.resetScores(line);
- }
- objective.getScore(entry).setScore(score);
- return entry;
- });
- return this;
- }
- @Override
- public void addTask(Consumer<? super Board> runnable, long delay, long period, @NotNull TimeUnit scale) {
- BoardTask task = new BoardTask(() -> runnable.accept(this), scale.toMillis(period));
- task.setNextRun(System.currentTimeMillis() + scale.toMillis(delay));
- tasksQueue.add(task);
- }
- @Override
- public void shutdownNow() {
- tasksQueue.clear();
- }
- @Override
- public void resetScores(String entry) {
- board.resetScores(entry);
- }
- @Override
- public void sendPlayers(Player @NotNull ... player) {
- for(Player p : player) {
- p.setScoreboard(board);
- }
- }
- @Override
- public void sendPlayer(@NotNull Player player) {
- player.setScoreboard(board);
- }
- @Override
- public void run() {
- long now = System.currentTimeMillis();
- BoardTask task = tasksQueue.poll();
- if(task == null) {
- return;
- }
- if(now >= task.getNextRun()) {
- task.getRunnable().run();
- }
- task.setNextRun(now + task.getPeriod());
- tasksQueue.add(task);
- }
- @Override
- public void close() {
- cleanable.clean();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement