1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Выход из шедуллера runTaskTimer

Тема в разделе "Разработка плагинов для новичков", создана пользователем SpokeKamchatka, 6 апр 2018.

  1. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    [РЕШЕНО]
    Привет
    Нужно после выполнения условия в run(){} код выходил из шедуллера и шел дальше, пробовал ставить if(someboolean) return;
    Но шедуллер идет дальше...

    Хочу сделать что-то наподобие "Таймера для отсчета игры"

    Вот, что у меня сейчас...
    PHP:
    Bukkit.getScheduler().runTaskTimer(this, new Runnable(){
                    
    int k 20;
                    @
    Override
                    
    public void run() {
                        
    k--;
                        
    p.playSound(p.getLocation(), Sound.BLOCK_LEVER_CLICK11);
                        
    p.sendMessage(colorTranslator("&aИгра начнется через " " секунд(а/у)"));
                        if(
    <= 1) return;
                    }
                }, 
    2020);
    //colorTranslator(String) заменяет "&" на \u007a
    //return не помогает...
    Алекс Рендж, жду тебя : D
     
    Последнее редактирование: 7 апр 2018
  2. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Можешь использовать BukkitRunnable вместо Runnable. В этом случае внутри достаточно будет просто прописать:
    Код:
    this.cancel();
    //запуск игры
    Либо ещё второй вариант.
    Bukkit.getScheduler().runTaskTimer(plugin, task, delay, period) возвращает BukkitTask, который можно отменить методом:
    Код:
    Bukkit.getScheduler().cancelTask(task);
     
    Последнее редактирование: 6 апр 2018
  3. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    Eclipse это не понравилось, пишет, что метод устарел : D Просто проигнорить, поставив СупрессВарнингс?)
     
  4. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Он не депрекатед
     
  5. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    И что же делать? Может, я не такой тип шедуллера взял?
     
  6. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    У бакит ранбл есть метод start его и юзай
     
  7. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    И в первом и во втором случае выбрасывает исключение ниже
    Во втором пишу Bukkit.getScheduler().cancelTask(getTaskId());
    И вроде бы он должен закрывать выполнение, но этого не происходит (
     

    Вложения:

    • wtf.png
      Размер файла:
      478,2 КБ
      Просмотров:
      23
  8. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Зачем тебе Bukkit getscheduler?
     
  9. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    А как по другому? cancel(); не работает - No scheduled yet. Так же с cancelTask(int);
    Работает только cancelAllTasks();, но это не вариант, так как у меня в плагине еще есть шедулеры...
    Есть конечно вариант использовать рантасклэйтер в for столько раз, сколько нужно, но это не гуманно... Ведь есть runTaskTimer, но его мне не удается остановить...
     
  10. Sitmobedaf

    Sitmobedaf Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    SiT
    Код:
    TaskID_1 = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
                @Override
                public void run() {
    . . .
     if(k <= 1) {
        Bukkit.getScheduler().cancelTask(TaskID_1);
     }
     
  11. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    int TaskID_1 = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable(){
    int k = 21;
    @Override
    public void run() {
    k --;
    p.sendMessage(colorTranslator("&fДо начала игры осталось &e" + smartSecondReturner(k)));
    if(k < 1){
    Bukkit.getScheduler().cancelTask(TaskID_1); //Eclipse говорит: The local variable TaskID_1 may not have been initialized
    }
    }

    },0,20);
     
  12. Sitmobedaf

    Sitmobedaf Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    SiT
    Так инициализируй:
    int TaskID_1 = -1;
     
  13. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    Инициализировал, всё равно не нравится

    //Local variable TaskID_1 defined in an enclosing scope must be final or effectively final
    Хочет сделать переменную финальной? Попробовал поставить - не нравится...
     
  14. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ля чувак я те сказал, не юзай Bukkit get scheduler. Юзай это new BukkitRunnable {…}.start()
     
  15. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    Тогда уже пример кода, где при условии шедулер будет останавливатся, а то я не оч понимаю
    runTaskLater деприкатен и после BukkitRunnable никакое старт не поставишь, лол, и зачем старт если надо стоп...

    Или я чего-то не понимаю )


    Bukkit.getScheduler().runTaskLater(this, new BukkitRunnable(){ //deprecated
    /*
    *A program element annotated @Deprecated is one that programmers are discouraged from using, typically because *it is dangerous, or because a better alternative exists. Compilers warn when a deprecated program element is

    *used or overridden in non-deprecated code.
    */

    int k = 21;
    @Override
    public void run() {
    k --;
    p.sendMessage(colorTranslator("&fДо начала игры осталось &e " + smartSecondReturner(k)));
    if(k < 1){
    Bukkit.getScheduler().cancelTask(TaskID_1);
    }
    }

    }.start() , 20); //method not found (?)
     
  16. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Остановится на 1 секунде до начала.
    PHP:
    new BukkitRunnable() {
                        
    int k 20;
                        @
    Override
                        
    public void run() {
                            
    p.sendMessage(colorTranslator("&fДо начала игры осталось &e " smartSecondReturner(k)));
                            
    k--;
                            if(
    k==0this.cancel();
                        }
                    }.
    runTaskTimer(plugin020);

     
  17. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ля я тебе сказал не юзать Bukkit scheduler, ты че тупой?
     
  18. Автор темы
    SpokeKamchatka

    SpokeKamchatka Активный участник Пользователь

    Баллы:
    66
    Простите тупого :3 Я просто нуб в runTask-ах, хихи. Тема закрыта, чтоле
     
  19. Sitmobedaf

    Sitmobedaf Старожил Пользователь

    Баллы:
    103
    Имя в Minecraft:
    SiT
    Тебе нужен scheduleSyncRepeatingTask, а не runTaskTimer.
    И как ты объявляешь переменную?
    Вставь весь код класса на pastebin и пришли ссылку.
     
  20. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Он уже разобрался и был готов закрыть тему. Сейчас опять его заплутаем.
     

Поделиться этой страницей