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

Статус
Закрыто для дальнейших ответов.

Bezobrazie

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
MySoulIsCry
Немогу найти способ как это сделать. мне нужно завершить его и начать новый который будет повторятся медленнее и делать немного другие действия.
PHP:
    public void startDonateCaseRollet(Inventory caseRolletInv, Player player) {
        caseRolletInv.setItem(10, DonateCaseRandom.getRandomDonateItem());
        player.playSound(player.getLocation(), Sound.BLOCK_DISPENSER_DISPENSE, 1, 1);
        Runnable r = new BukkitRunnable() {
           
            @Override
            public void run() {
                caseRolletInv.setItem(19, caseRolletInv.getItem(28));
                caseRolletInv.setItem(28, caseRolletInv.getItem(37));
                caseRolletInv.setItem(37, caseRolletInv.getItem(38));
                caseRolletInv.setItem(38, caseRolletInv.getItem(39));
                caseRolletInv.setItem(39, caseRolletInv.getItem(40));
                caseRolletInv.setItem(40, caseRolletInv.getItem(41));
                caseRolletInv.setItem(41, caseRolletInv.getItem(42));
                caseRolletInv.setItem(42, caseRolletInv.getItem(43));
                caseRolletInv.setItem(43, caseRolletInv.getItem(34));
                caseRolletInv.setItem(34, caseRolletInv.getItem(25));
                caseRolletInv.setItem(25, caseRolletInv.getItem(16));
                caseRolletInv.setItem(16, caseRolletInv.getItem(15));
                caseRolletInv.setItem(15, caseRolletInv.getItem(14));
                caseRolletInv.setItem(14, caseRolletInv.getItem(13));
                caseRolletInv.setItem(13, caseRolletInv.getItem(12));
                caseRolletInv.setItem(12, caseRolletInv.getItem(11));
                caseRolletInv.setItem(11, caseRolletInv.getItem(10));
                caseRolletInv.setItem(10, DonateCaseRandom.getRandomDonateItem());
                player.playSound(player.getLocation(), Sound.BLOCK_DISPENSER_DISPENSE, 1, 1);
                if(caseRolletInv.getItem(10).getType() != Material.AIR) {
                    //тут нужно его завершить и выполнять уже другой Scheduler.
                }
               
            }
        };       
       
        Bukkit.getScheduler().scheduleSyncRepeatingTask(main, r, 1, 1);
       
       
    }
 
this.cancel()
 
Это, тут немного не работает(
PHP:
java.lang.IllegalStateException: Not 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]
 
Это, тут немного не работает(
PHP:
java.lang.IllegalStateException: Not 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]
Таск сперва запусти, а потом останавливай.
 
Таск сперва запусти, а потом останавливай.
ну изходя из кода я думаю понятно что нельзя его сначала запустить а потом остановить, так как он останавливается внутри того когда он запущен.
я щас немного изменил как это все будет работать.
есть еще пару вопросов.
PHP:
public class RolletDonateCase implements Runnable {


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

    public void startDonateCaseRollet() {




        id = Bukkit.getScheduler().scheduleSyncRepeatingTask(main, this, 1, 5);
        speens = 0;

    }

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

        caseRolletInv.setItem(19, DonateCaseRandom.getRandomDonateItem());
        player.playSound(player.getLocation(), Sound.BLOCK_DISPENSER_DISPENSE, 1, 1);
       
       
       
       
        speens++;
    }
}
будет ли эта тема работать одновременно для разных игроков. По сути должна но не уверен.
и возможно ли както изменить скорость прокрутки Schedylera во время его исполнения?
 
ну изходя из кода я думаю понятно что нельзя его сначала запустить а потом остановить, так как он останавливается внутри того когда он запущен.
Ну да тебе виднее, перевели текст ошибки java.lang.IllegalStateException: Not scheduled yet
 
Ну да тебе виднее, перевели текст ошибки java.lang.IllegalStateException: Not scheduled yet
ну дак она у меня спамится в консоль потому что она в цикличном потоке, тоесть сам поток пытается завершить себя много раз и у него не получается.
это уже хадно я забил. можешь сказать возможно ли както изменить скорость прокрутки Schedylera во время его исполнения?
 
Код:
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)
 
Код:
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)
Я тоже хотел рекурсивно (если так можно назвать) запускать шедулер, или в асинхронном просто останавливать его(Не уверен что в нем можно с инвентарем заимодействовать) но это дошло уже до меня когда я спал)
 
Код:
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)
Выбрасывай :good:
 
Возможно, вот только черт его знает как по другому реализовать
Две переменные: currentTicksLeft и maxDurationTicks. Каждый тик уменьшаем current, как только достигает нуля - меняем current на max, после max тоже уменьшаем на некоторое значение
 
Последнее редактирование:
Вообще, я считаю, что создавать новый экземпляр класса для каждого изменения скорости - такая себе затея
 
Ну дак та расскажи как будет лучше)
Через репит шедулер как вариант можно в принципе. Условно есть переменная wait, равная 200 тикам и переменная tick, которая увеличивается до тех пор, пока не будет больше или равна переменной wait. Как только переменная tick больше или равна переменной wait, переменная tick обнуляется, а wait уменьшается на n тиков. Дальше просто расставь ретурны в нужных местах и логику свою туда запиши.
Примеры можешь даже не просить, ибо с мобилы я тебе их писать не буду. Так же для остановки шедулера - метод cancel и для запуска нового создаешь новый экземпляр.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх