программирование модификации блоков с таймером

awotnet

Пользователь
Сообщения
1
Я новичок в Spigot API и много вещей в нём ещё не знаю, так что прошу отнестись к вопросу с пониманием.
Я написал один Java-плагин (игра Memory), который создаёт игровое поле при нажатии игроком на рычаг. После появления поля включается таймер на 15 секунд. Игроку даётся время на запоминание блоков на игровом поле. Таймер высвечивает каждые 5 секунд остаточное время. По устечению времени поле исчезает и игрок должен установить цветные блоки в правильные места, а затем при повороте рычага блоки сравниваются и выдаётся ответ.
Вначале мне задача показалась простой, но фрагмент с таймером и с исчезновением поля оказался нетривиальный. Я заметил, что визуализация изменений блоков осуществляется только по завершению плагина, а не в режиме реального времени. Другими словами поле даже не успевало появиться, как уже исчезало. Тогда я стал работать с BukkitScheduler для исчезновения поля. Это помогло, но возникла проблема с таймером. Его тоже нужно было выводить в отдельный таск, иначе он блокировал появление поля. С таском удалось сделать таймер, но стало непонятно, как его завершить. В конце концов я сделал ещё один таск, в котором закрыл все предыдущие. Получилось нагромождение тасков и хотя плагин работает, но результатом я не доволен:

Фрагмент кода:
Java:
    private void createAndDestroyPlayGround(BlockRedstoneEvent event, Player player, int size) {
        playGround = new PlayGround();
        playGround.createPlayGround(player, getMatrix(player, size));
        AtomicInteger timer = new AtomicInteger(15);
        Bukkit.getScheduler().runTaskTimer(this, () -> {
            player.sendMessage(String.valueOf(timer.get()));
            timer.addAndGet(-5);
        }, 0L, 5 * 20L);
        Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
            playGround.destroyPlayGround();
            event.setNewCurrent(0);
            BlockState state = event.getBlock().getState();
            Lever lever = (Lever) state.getData();
            lever.setPowered(false);
            state.setData(lever);
            state.update(true);
        }, 15 * 20L);
        Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
            Bukkit.getScheduler().cancelTasks(this);
        }, 15 * 20L + 1L);
    }

Есть более элегантные варианты для решения этой проблемы ?
 
Один из вариантов, использовать интерфейс BukkitTask, он позволяет завершать таск с помощью метода .cancel()
 
Назад
Сверху Снизу