1.12.2 Bukkit Runnable Stops Other Bukkit Runnable after it stops

Discussion in 'Spigot Plugin Development' started by xUbalubex, Feb 19, 2020.

  1. I currently have 2 Bukkit Runnables in my plugin: 1 to handle game time and the other to handle evac extraction points.

    I have an issue though. The extraction point runnables happen when you get near something and only last x amount of seconds (in my testing its 3). After it reaches 0, it cancels itself and takes you out of the game. Works perfectly. But I have another runnable that is going through the time of the game and updating my scoreboard and after the extraction runnable cancels itself. The scoreboard stops working. How do I fix?

    Code:
    Evacuation Runnable
    Code (Java):
    public void startEvac(Title t, Player p, evacs evac)
        {
            UsersBeingEvacced.put(p.getUniqueId(), 0);
            BukkitTask task = new BukkitRunnable() {
                int seconds = 3;
                @Override
                public void run() {
                    if(!p.isDead())
                    {
                        if(evac == evacs.EVAC1 && bunkerTime == 0)
                        {
                            expireEvac(t, p, evac);
                            this.cancel();
                        }
                        else
                        {
                            if(evac == evacs.EVAC2 && roofTopTime == 0)
                            {
                                expireEvac(t, p, evac);
                                this.cancel();
                            }
                            else
                            {
                                if(evac == evacs.EVAC2 && DocksTime == 0)
                                {
                                    expireEvac(t, p, evac);
                                    this.cancel();
                                }
                            }
                        }
                        if(seconds != 0)
                        {
                            seconds--;
                            t.sendTitle(p, ChatColor.AQUA + "Evac Point Reached!", seconds + " Remaining...", 20, 20, 20);
                        }
                        else
                        {
                            p.sendMessage(ChatColor.GREEN + "WIN!");
                            playerEvacuate(p);
                            this.cancel();
                        }
                    }
                }
               
            }.runTaskTimer(this, 0, 20);
           
           
        }
    Game Handle Runnable:
    Code (Java):
    public void handleGame()
        {
           
            BukkitTask task = new BukkitRunnable() {
                @Override
                public void run() {
                    if(gameTime == 0)
                    {
                        stopGameTime();
                        for(Player p : inGameUsers.keySet())
                        {
                            p.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
                        }
                        this.cancel();
                    }
                    else
                    {
                        gameTime--;
                        if(bunkerTime != 0)
                        {
                            bunkerTime--;
                        }
                        else
                        {
                            if(roofTopTime != 0)
                            {
                                roofTopTime--;
                            }
                            else
                            {
                                if(DocksTime != 0)
                                {
                                    DocksTime--;
                                }
                            }
                        }
                        updateScoreboard();
                    }
                }
            }.runTaskTimer(this, 0, 20);
        }
    Thanks!
     
  2. Can you show whole class and what expireEvac method do?
     
  3. Code (Java):
    public void updateScoreboard()
        {
            ScoreboardManager manager = Bukkit.getScoreboardManager();
            Scoreboard board = manager.getNewScoreboard();
            Objective objective = board.registerNewObjective("gameStats", "dummy");
            objective.setDisplaySlot(DisplaySlot.SIDEBAR);
            objective.setDisplayName(ChatColor.GREEN + "15 Minutes in Chernobyl");
            time = objective.getScore(ChatColor.GREEN + "Time Left: " + gameTime);
            time.setScore(14);
           
            Score filler = objective.getScore("-----------");
            filler.setScore(13);
           
            if(bunkerTime != 0)
            {
                Score EscortOne = objective.getScore(ChatColor.GREEN + "[1] Bunker - " + bunkerTime);
                EscortOne.setScore(12);
            }
            else
            {
                Score EscortOne = objective.getScore(ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "[1] Bunker");
                EscortOne.setScore(12);
            }
           
            if(roofTopTime != 0)
            {
                Score EscortTwo = objective.getScore(ChatColor.GREEN + "[2] Rooftop - " + roofTopTime);
                EscortTwo.setScore(11);
            }
            else
            {
                Score EscortTwo = objective.getScore(ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "[2] Rooftop");
                EscortTwo.setScore(11);
            }
           
            if(DocksTime != 0)
            {
                Score EscortThree = objective.getScore(ChatColor.GREEN + "[3] Docks - " + DocksTime);
                EscortThree.setScore(10);
            }
            else
            {
                Score EscortThree = objective.getScore(ChatColor.RED + "" + ChatColor.STRIKETHROUGH + "[3] Docks");
                EscortThree.setScore(10);
            }
           
            for(Player p : inGameUsers.keySet())
            {
                p.setScoreboard(board);
            }
        }
       
        public void handleGame()
        {
           
            BukkitTask task = new BukkitRunnable() {
                @Override
                public void run() {
                    if(gameTime == 0)
                    {
                        for(Player p : inGameUsers.keySet())
                        {
                            p.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
                        }
                        this.cancel();
                    }
                    else
                    {
                        gameTime--;
                        if(bunkerTime != 0)
                        {
                            bunkerTime--;
                        }
                        else
                        {
                            if(roofTopTime != 0)
                            {
                                roofTopTime--;
                            }
                            else
                            {
                                if(DocksTime != 0)
                                {
                                    DocksTime--;
                                }
                            }
                        }
                        updateScoreboard();
                    }
                }
            }.runTaskTimer(this, 0, 20);
        }
       
        public void stopCountdown()
        {
            Bukkit.getServer().getScheduler().cancelTask(countDownTaskID);
        }
       
        @SuppressWarnings("deprecation")
        public void StartGame()
        {
            for(Player p : inGameUsers.keySet())
            {
                p.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 200, 5));
            }
           
            Title title = new Title();
           
            countDownTaskID = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new BukkitRunnable() {
                    int intVar = 10;
                    public void run() {
                        intVar--;
                        if(intVar == 0)
                        {
                            stopCountdown();
                            Bukkit.broadcastMessage(ChatColor.GREEN + "GO!");
                            gameTime = 15;
                            bunkerTime = 5;
                            roofTopTime = 5;
                            DocksTime = 5;
                            handleGame();
                        }
                        else
                        {
                            for(Player p : inGameUsers.keySet())
                            {
                                title.sendTitle(p, ChatColor.AQUA + "Prepare...", "[" + ChatColor.RED + intVar + "]", 20, 20, 20);
                            }
                        }
                    }
                }, 0, 20);
           
        }
    Code (Java):
    public void playerEvacuate(Player p)
        {
            inGameUsers.remove(p);
            p.teleport((Location)getConfig().get("Lobby"));
        }
       
        public void expireEvac(Title t, Player p, evacs evac)
        {
            UsersBeingEvacced.remove(p);
            p.sendMessage(ChatColor.RED + "This Evac Point is no longer avaliable!");
        }
       
        public void startEvac(Title t, Player p, evacs evac)
        {
            UsersBeingEvacced.put(p.getUniqueId(), 0);
            BukkitTask task = new BukkitRunnable() {
                int seconds = 3;
                @Override
                public void run() {
                    if(!p.isDead())
                    {
                        if(evac == evacs.EVAC1 && bunkerTime == 0)
                        {
                            expireEvac(t, p, evac);
                            this.cancel();
                        }
                        else
                        {
                            if(evac == evacs.EVAC2 && roofTopTime == 0)
                            {
                                expireEvac(t, p, evac);
                                this.cancel();
                            }
                            else
                            {
                                if(evac == evacs.EVAC2 && DocksTime == 0)
                                {
                                    expireEvac(t, p, evac);
                                    this.cancel();
                                }
                            }
                        }
                        if(seconds != 0)
                        {
                            seconds--;
                            t.sendTitle(p, ChatColor.AQUA + "Evac Point Reached!", seconds + " Remaining...", 20, 20, 20);
                        }
                        else
                        {
                            p.sendMessage(ChatColor.GREEN + "WIN!");
                            playerEvacuate(p);
                            this.cancel();
                        }
                    }
                }
               
            }.runTaskTimer(this, 0, 20);
           
           
        }
       
        @EventHandler
        public void checkIfNearEvacZone(PlayerMoveEvent e)
        {
            if (e.getFrom().getBlock().equals(e.getTo().getBlock()))
            {
                return;
            }
           
            Title title = new Title();
            if(inGameUsers.containsKey(e.getPlayer()))
            {
                //Bunker
                if(bunkerTime > 0)
                {
                    if(e.getPlayer().getLocation().distance((Location) getConfig().get("BunkerExitPoint")) <= 3 && !UsersBeingEvacced.containsKey(e.getPlayer().getUniqueId()) && inGameUsers.containsKey(e.getPlayer()))
                    {
                        startEvac(title, e.getPlayer(), evacs.EVAC1);
                    }
                }
                else
                {
                    if(roofTopTime > 0)
                    {
                        if(e.getPlayer().getLocation().distance((Location) getConfig().get("BunkerExitPoint")) <= 3 && !UsersBeingEvacced.containsKey(e.getPlayer()))
                        {
                            startEvac(title, e.getPlayer(), evacs.EVAC2);
                        }
                    }
                    else
                    {
                        if(DocksTime > 0)
                        {
                            if(e.getPlayer().getLocation().distance((Location) getConfig().get("DockExitPoint")) <= 3 && !UsersBeingEvacced.containsKey(e.getPlayer()))
                            {
                                startEvac(title, e.getPlayer(), evacs.EVAC3);
                            }
                        }
                    }
                }
               
            }
        }
     
  4. cmon bruh do some debugging. your "issue" is vague. does your gametime runnable cancel or does it run but not do anything? if it cancels, and the only method that calls its cancellation is a self cancel, then the condition to cancel is being met. if thats not the only cancel, it can be either self cancel or the other cancels. or theres an abusive plugin calling #cancelAllTasks (why does this method have to be publicly available to noobs). if it runs and doesnt do anything then u got a logic issue. print debug msgs and figure out why your logic is wrong
     
  5. Ah I figured out the issue actually. I am kind of stupid lol. But everytime the player evacs, it removes them from the hashmap. I was doing a check everytime the timer updated and it would break. There were no errors in the console which is what kind of threw me off.
     
  6. Assuming your issue is solved, please mark this thread as solved, so others don't think you need any further help.
     
  7. Yes, I agree with Stef.
    Or people will just keep coming here thinking you need help.