Stop repeating task function

Discussion in 'Plugin Development' started by Kicksy, Nov 30, 2019.

  1. Offline

    Kicksy

    I want to stop this function:
    Code:
        public void iSpawn() {
            if (spawn) {
                for (String spawn : plugin.file.itemConfig.getConfigurationSection("spawn").getKeys(false)) {
                    Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
    
                        @Override
                        public void run() {
                            @SuppressWarnings("deprecation")
                            ItemStack stack = new ItemStack(
                                    Integer.parseInt((String) plugin.file.itemConfig.get("spawn." + spawn + ".item")));
                            Bukkit.getWorld("world")
                                    .dropItem((Location) plugin.file.itemConfig.get("spawn." + spawn + ".position"), stack)
                                    .setPickupDelay(0);
                        }
                    }, 0L, Integer.parseInt((String) plugin.file.itemConfig.get("spawn." + spawn + ".cooldown")));
    
                }
            }else
                return;
        }
    from a other function. I tried it so but this dont help:
    Code:
    else if (args[0].equalsIgnoreCase("start")) {
    
                            spawn = true;
                       
                        } else if (args[0].equalsIgnoreCase("stop")) {
                            spawn = false;
                       
    
                        }
     
  2. Offline

    yPedx

    @Kicksy
    From within your scheduler you must check if spawn == true before spawning the items.
     
  3. Offline

    Kicksy

    I am doing this.
    Code:
    if(boolean)
    is automatically
    Code:
    if(boolean == true)
    I think
     
  4. Offline

    knokko

    Correct, but you are not doing that check at the right place. Currently, you check if `spawn` is true, and start a repeating task if so. But when you change `spawn` to false, the repeating task has already begun.
    You should (instead) check if `spawn` is true inside the run() method.

    Alternatively, you could cancel the task properly: scheduleSyncRepeatingTask will return an int. If you use that int in Bukkit.getScheduler().cancelTask(), you can stop the entire task.
     
  5. Offline

    Kicksy

    @knokko how i can get the int?
     
  6. Offline

    knokko

    Code:
    int taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask...
    But whether you should go for your original approach or the alternative one depends on how you are planning to use this. If you want to start and stop the task once, the alternative would be better.

    But if you plan to start and stop the task multiple times, your original approach would be better (but you need to move the if(spawn) to inside the run() method.)
     
  7. Offline

    Kicksy

    Thanks!

    Edit: But I have also a problem that if I am removing a value from the file there is always a error when the task should be performed. I would prefer to restart the task than before using the try catch method.
    @knokko
     
    Last edited: Dec 1, 2019

Share This Page