Продвинутое использование BukkitRunnable

Продвинутое использование BukkitRunnable

Hyrancood

Пользователь
Сообщения
4
Hyrancood добавил(а) новый ресурс:

Продвинутое использование BukkitRunnable - Статья по продвинутому использованию BukkitRunnable в разработке плагинов

Примечание: хотя в поддерживаемых версиях указаны 1.16+, насколько я знаю, BukkitRunnable работает аналогичным образом и на более ранних версиях, но утверждать этого не могу.
В этой статье я постараюсь показать все возможные способы использования BukkitRunnable при разработке плагинов, идя от простого к сложному. Без лишних слов, приступим.

Базовый уровень
Для начала зарегистрируем основной класс плагина и класс с...

Узнать больше об этом ресурсе...
 
"Чуть сложнее, но всё ещё должен знать и понимать каждый"

В современном баккит апи это стоит делать гораздо лучшим путём

Java:
final AtomicInteger runCount = new AtomicInteger();

server.getScheduler().runTaskTimer(plugin, task -> {
    if (runCount.incrementAndGet() == 10) {
        task.cancel();
        return;
    }   

    doWork()
}, 0, 50)

В моём примере doWork будет вызвана 10 раз с периодичностью 50 тиков
 
"Чуть сложнее, но всё ещё должен знать и понимать каждый"

В современном баккит апи это стоит делать гораздо лучшим путём

Java:
final AtomicInteger runCount = new AtomicInteger();

server.getScheduler().runTaskTimer(plugin, task -> {
    if (runCount.incrementAndGet() == 10) {
        task.cancel();
        return;
    }  

    doWork()
}, 0, 50)

В моём примере doWork будет вызвана 10 раз с периодичностью 50 тиков
Проблема в том, что при использовании лямбда выражения используется Runnable, а не BukkitRunnable, и, следовательно, отменить задачу с помощью cancel() нельзя. Конечно можно оставить задачу и просто выходить из неё
Java:
final AtomicInteger runCount = new AtomicInteger();
server.getScheduler().runTaskTimer(plugin, task -> {
    if (runCount.incrementAndGet() == 10) return;
    doWork()
}, 0, 50);
и, конечно, это не будет особо сильно нагружать сервер, но если таких задач накопится много, то, наверное, будет плохо. Поэтому в таком случае уж лучше полноценно реализовать BukkitRunnable и ничего не засорять, используя cancel().
Поправьте, если где-то ошибся.
 
Проблема в том, что при использовании лямбда выражения используется Runnable, а не BukkitRunnable, и, следовательно, отменить задачу с помощью cancel() нельзя. Конечно можно оставить задачу и просто выходить из неё
Java:
final AtomicInteger runCount = new AtomicInteger();
server.getScheduler().runTaskTimer(plugin, task -> {
    if (runCount.incrementAndGet() == 10) return;
    doWork()
}, 0, 50);
и, конечно, это не будет особо сильно нагружать сервер, но если таких задач накопится много, то, наверное, будет плохо. Поэтому в таком случае уж лучше полноценно реализовать BukkitRunnable и ничего не засорять, используя cancel().
Поправьте, если где-то ошибся.
Что? Это не Runnable, а Consumer<BukkitTask>. Оно как раз и позволяет тебе отменить задачу внутри лямбды, как я сделал в моём примере
 
Назад
Сверху Снизу