Solved Problem with repeating task

Discussion in 'Spigot Plugin Development' started by Halflove, Jul 4, 2018.

  1. Hey, so basically I have a repeating task set up that I need to be running for only 60 seconds when started and then it's supposed to cancel itself. It works perfectly fine, but sometimes if I leave my server online with the plugin loaded for a while and I come back it completely breaks and freezes at either 29 or 59 seconds. Any help or tips would be much appreciated as I'm experimenting with something I've never attempted before:

    Code (Text):
    BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
                    taskID = scheduler.scheduleSyncRepeatingTask(Main.plugin, new Runnable() {
                        @Override
                        public void run() {
                                    if(countdown.containsKey(map)) {
                                        if(countdown.get(map) == 0) {
                                            countdown.remove(map);
                                            Bukkit.getScheduler().cancelTask(taskID);
                                            startGame(map);
                                            return;
                                        }
                                        if((countdown.get(map) % 15 == 0)||(countdown.get(map)<=5)) {
                                            for(Player player : Bukkit.getServer().getOnlinePlayers()) {
                                                if(isLobby(player)&&inlobby.get(player.getName()).equals(map)) {
                                                    player.sendMessage(ChatColor.YELLOW + "Game starting in " + SettingsManager.formatTime(countdown.get(map)));
                                                    TitleAPI.sendTitle(player,0,40,15,"&a&lGame Starting","&7In "+ SettingsManager.formatTime(countdown.get(map)));
                                                }
                                            }
                                        }
                                        if(countdown.get(map)==6) {
                                            unavailable.add(map);
                                            SettingsManager.getConfig().set("unavailable", unavailable);
                                            SettingsManager.saveConfig();
                                            int players = 0;
                                            for(Player player : Bukkit.getOnlinePlayers()) {
                                                String pmap = "";
                                                if(isLobby(player)) {
                                                    pmap = inlobby.get(player.getName());
                                                }
                                                if(pmap.equals(map)) {
                                                    String world1 = SettingsManager.getConfig().getString("map."+map+".spawn1.world");
                                                    double x1 = SettingsManager.getConfig().getDouble("map."+map+".spawn1.x");
                                                    double y1 = SettingsManager.getConfig().getDouble("map."+map+".spawn1.y");
                                                    double z1 = SettingsManager.getConfig().getDouble("map."+map+".spawn1.z");
                                                    float pitch1 = SettingsManager.getConfig().getLong("map."+map+".spawn1.pitch");
                                                    float yaw1 = SettingsManager.getConfig().getLong("map."+map+".spawn1.yaw");
                                                    Location one = new Location(Bukkit.getServer().getWorld(world1), x1, y1, z1, yaw1, pitch1);
                                                    String world2 = SettingsManager.getConfig().getString("map."+map+".spawn2.world");
                                                    double x2 = SettingsManager.getConfig().getDouble("map."+map+".spawn2.x");
                                                    double y2 = SettingsManager.getConfig().getDouble("map."+map+".spawn2.y");
                                                    double z2 = SettingsManager.getConfig().getDouble("map."+map+".spawn2.z");
                                                    float pitch2 = SettingsManager.getConfig().getLong("map."+map+".spawn.2.pitch");
                                                    float yaw2 = SettingsManager.getConfig().getLong("map."+map+".spawn.2.yaw");
                                                    Location two = new Location(Bukkit.getServer().getWorld(world2), x2, y2, z2, yaw2, pitch2);
                                                    String world3 = SettingsManager.getConfig().getString("map."+map+".spawn3.world");
                                                    double x3 = SettingsManager.getConfig().getDouble("map."+map+".spawn3.x");
                                                    double y3 = SettingsManager.getConfig().getDouble("map."+map+".spawn3.y");
                                                    double z3 = SettingsManager.getConfig().getDouble("map."+map+".spawn3.z");
                                                    float pitch3 = SettingsManager.getConfig().getLong("map."+map+".spawn3.pitch");
                                                    float yaw3 = SettingsManager.getConfig().getLong("map."+map+".spawn3.yaw");
                                                    Location three = new Location(Bukkit.getServer().getWorld(world3), x3, y3, z3, yaw3, pitch3);
                                                    String world4 = SettingsManager.getConfig().getString("map."+map+".spawn4.world");
                                                    double x4 = SettingsManager.getConfig().getDouble("map."+map+".spawn4.x");
                                                    double y4 = SettingsManager.getConfig().getDouble("map."+map+".spawn4.y");
                                                    double z4 = SettingsManager.getConfig().getDouble("map."+map+".spawn4.z");
                                                    float pitch4 = SettingsManager.getConfig().getLong("map."+map+".spawn4.pitch");
                                                    float yaw4 = SettingsManager.getConfig().getLong("map."+map+".spawn4.yaw");
                                                    Location four = new Location(Bukkit.getServer().getWorld(world4), x4, y4, z4, yaw4, pitch4);
                                                    players = players+1;
                                                    playerslot.put(player.getName(), players);
                                                    pregame.put(player.getName(), true);
                                                    if(playerslot.get(player.getName())==1) {
                                                        player.teleport(one);
                                                    }else if(playerslot.get(player.getName()) == 2) {
                                                        player.teleport(two);
                                                    }else if(playerslot.get(player.getName()) == 3) {
                                                        player.teleport(three);
                                                    }else if(playerslot.get(player.getName()) == 4){
                                                        player.teleport(four);
                                                    }
                                                }
                                            }
                                        }
                                        countdown.put(map, countdown.get(map)-1);
                                    }else {
                                        Bukkit.getScheduler().cancelTask(taskID);
                                    }
                        }
                    }, 1, 20);
    Thanks for the help :)
     
  2. Code (Java):
    new BukkitRunnable() {
        private int count = 0;

        @Override
        public void run() {
            if (count >= 60) {
                cancel();
                return;
            }

            count++;

            // do stuffs
        }
    }.runTaskTimer(this, 0, 20);
    Just make a self-cancelling BukkitRunnable.
     
    • Informative Informative x 1
  3. Well that's a hell of a lot easier, thanks for showing me this :)