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

Помогите Как завершить повторяющийся Scheduler?

Тема в разделе "Разработка плагинов для новичков", создана пользователем Bezobrazie, 15 июл 2021.

Статус темы:
Закрыта.
  1. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Немогу найти способ как это сделать. мне нужно завершить его и начать новый который будет повторятся медленнее и делать немного другие действия.
    PHP:
        public void startDonateCaseRollet(Inventory caseRolletInvPlayer player) {
            
    caseRolletInv.setItem(10DonateCaseRandom.getRandomDonateItem());
            
    player.playSound(player.getLocation(), Sound.BLOCK_DISPENSER_DISPENSE11);
            
    Runnable r = new BukkitRunnable() {
               
                @
    Override
                
    public void run() {
                    
    caseRolletInv.setItem(19caseRolletInv.getItem(28));
                    
    caseRolletInv.setItem(28caseRolletInv.getItem(37));
                    
    caseRolletInv.setItem(37caseRolletInv.getItem(38));
                    
    caseRolletInv.setItem(38caseRolletInv.getItem(39));
                    
    caseRolletInv.setItem(39caseRolletInv.getItem(40));
                    
    caseRolletInv.setItem(40caseRolletInv.getItem(41));
                    
    caseRolletInv.setItem(41caseRolletInv.getItem(42));
                    
    caseRolletInv.setItem(42caseRolletInv.getItem(43));
                    
    caseRolletInv.setItem(43caseRolletInv.getItem(34));
                    
    caseRolletInv.setItem(34caseRolletInv.getItem(25));
                    
    caseRolletInv.setItem(25caseRolletInv.getItem(16));
                    
    caseRolletInv.setItem(16caseRolletInv.getItem(15));
                    
    caseRolletInv.setItem(15caseRolletInv.getItem(14));
                    
    caseRolletInv.setItem(14caseRolletInv.getItem(13));
                    
    caseRolletInv.setItem(13caseRolletInv.getItem(12));
                    
    caseRolletInv.setItem(12caseRolletInv.getItem(11));
                    
    caseRolletInv.setItem(11caseRolletInv.getItem(10));
                    
    caseRolletInv.setItem(10DonateCaseRandom.getRandomDonateItem());
                    
    player.playSound(player.getLocation(), Sound.BLOCK_DISPENSER_DISPENSE11);
                    if(
    caseRolletInv.getItem(10).getType() != Material.AIR) {
                        
    //тут нужно его завершить и выполнять уже другой Scheduler.
                    
    }
                   
                }
            };       
           
            
    Bukkit.getScheduler().scheduleSyncRepeatingTask(mainr11);
           
           
        }
     
  2. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    this.cancel()
     
  3. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Господи как я глуп) спасибо
     
  4. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Это, тут немного не работает(
    PHP:
    java.lang.IllegalStateExceptionNot scheduled yet
            at org
    .bukkit.scheduler.BukkitRunnable.checkScheduled(BukkitRunnable.java:149) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at org.bukkit.scheduler.BukkitRunnable.getTaskId(BukkitRunnable.java:143) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at org.bukkit.scheduler.BukkitRunnable.cancel(BukkitRunnable.java:29) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at me.advancedcase.cases.RolletDonateCase$1.run(RolletDonateCase.java:38) ~[?:?]
            
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:64) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:423) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:840) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:423) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:774) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:666) ~[patched_1.12.2.jar:git-Paper-1618]
            
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_45]
     
  5. alexandrage

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

    Баллы:
    173
    Таск сперва запусти, а потом останавливай.
     
  6. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    ну изходя из кода я думаю понятно что нельзя его сначала запустить а потом остановить, так как он останавливается внутри того когда он запущен.
    я щас немного изменил как это все будет работать.
    есть еще пару вопросов.
    PHP:
    public class RolletDonateCase implements Runnable {


        private 
    Main main;
        private 
    Inventory caseRolletInv;
        private 
    Player player;
        private 
    int id;
        private 
    int speens;
       
        public 
    RolletDonateCase(Main mainInventory caseRolletInv,  Player player) {
            
    this.main main;
            
    this.caseRolletInv caseRolletInv;
            
    this.player player;
        }

        public 
    void startDonateCaseRollet() {




            
    id Bukkit.getScheduler().scheduleSyncRepeatingTask(mainthis15);
            
    speens 0;

        }

        @
    Override
        
    public void run() {
           
            
    caseRolletInv.setItem(25caseRolletInv.getItem(24));
            
    caseRolletInv.setItem(24caseRolletInv.getItem(23));
            
    caseRolletInv.setItem(23caseRolletInv.getItem(24));
            
    caseRolletInv.setItem(23caseRolletInv.getItem(22));
            
    caseRolletInv.setItem(22caseRolletInv.getItem(21));
            
    caseRolletInv.setItem(21caseRolletInv.getItem(20));
            
    caseRolletInv.setItem(20caseRolletInv.getItem(19));

            
    caseRolletInv.setItem(19DonateCaseRandom.getRandomDonateItem());
            
    player.playSound(player.getLocation(), Sound.BLOCK_DISPENSER_DISPENSE11);
           
           
           
           
            
    speens++;
        }
    }
    будет ли эта тема работать одновременно для разных игроков. По сути должна но не уверен.
    и возможно ли както изменить скорость прокрутки Schedylera во время его исполнения?
     
  7. alexandrage

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

    Баллы:
    173
    Ну да тебе виднее, перевели текст ошибки java.lang.IllegalStateException: Not scheduled yet
     
  8. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    ну дак она у меня спамится в консоль потому что она в цикличном потоке, тоесть сам поток пытается завершить себя много раз и у него не получается.
    это уже хадно я забил. можешь сказать возможно ли както изменить скорость прокрутки Schedylera во время его исполнения?
     
  9. Demrenus

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

    Баллы:
    66
    Код:
    new MyTask(200).runTaskLater(plugin, 200);
    
    public class MyTask extends BukkitRunnable {
        private int speed;
    
        public MyTask(int speed) {
            this.speed = speed;
        }
    
        @Override
        public void run() {
                                
            if(speed == 0) {
                return; // Останавливаемся.
            } else {
                speed -= 20; // Ускоряем цикл на секунду
            }
                
            new MyTask(speed).runTaskLater(plugin, speed);
        }
    }
    
    Практически на первой странице гугла. Начинает шедулер с 10 секунд, и каждый раз увеличивается на секунду. Когда достигает нуля - останавливается (если это не нужно, просто убери return)
     
  10. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Я тоже хотел рекурсивно (если так можно назвать) запускать шедулер, или в асинхронном просто останавливать его(Не уверен что в нем можно с инвентарем заимодействовать) но это дошло уже до меня когда я спал)
     
  11. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Выбрасывай :good:
     
  12. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Почему?
     
  13. Demrenus

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

    Баллы:
    66
    Возможно, вот только черт его знает как по другому реализовать
     
  14. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Две переменные: currentTicksLeft и maxDurationTicks. Каждый тик уменьшаем current, как только достигает нуля - меняем current на max, после max тоже уменьшаем на некоторое значение
     
    Последнее редактирование: 16 июл 2021
  15. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    А, я думал это репит таск))
     
  16. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Вообще, я считаю, что создавать новый экземпляр класса для каждого изменения скорости - такая себе затея
     
  17. Автор темы
    Bezobrazie

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

    Баллы:
    46
    Имя в Minecraft:
    MySoulIsCry
    Ну дак та расскажи как будет лучше)
     
  18. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Через репит шедулер как вариант можно в принципе. Условно есть переменная wait, равная 200 тикам и переменная tick, которая увеличивается до тех пор, пока не будет больше или равна переменной wait. Как только переменная tick больше или равна переменной wait, переменная tick обнуляется, а wait уменьшается на n тиков. Дальше просто расставь ретурны в нужных местах и логику свою туда запиши.
    Примеры можешь даже не просить, ибо с мобилы я тебе их писать не буду. Так же для остановки шедулера - метод cancel и для запуска нового создаешь новый экземпляр.
     
Статус темы:
Закрыта.

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