Need Help Stopping Repeating Task

Discussion in 'Plugin Development' started by lordbobby104, Nov 30, 2013.

Thread Status:
Not open for further replies.
  1. Offline

    lordbobby104

    While coding my eagle kit I came across an error I haven't seen before. Looking back inot my code I was able to find that it was because I wasn't stopping the repeating task. This part of bukkit is not my strong point and I was wondering if anyone can help me stop the task. The Event in which the tasks are in is below:

    Code:
        @EventHandler
        public void onPlayerInteract(PlayerInteractEvent e) {
            if(!(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
            if(e.getPlayer().getItemInHand().getType() == Material.FEATHER) {
                final Player player = (Player) e.getPlayer();
                if(!(h.contains(player))) {
                    player.setAllowFlight(true);
                    player.sendMessage(ChatColor.GRAY + "Fly away!");
                    h.add(player);
                    eg.put(player.getName(), 7);
                   
                    Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this.plugin, new Runnable() {
                        public void run() {
                            if(!(eg.get(player.getName()) == 0)) {
                                player.sendMessage(ChatColor.RED + "" + eg.get(player.getName()) + " seconds of flight remaining!");
                                eg.put(player.getName(), eg.get(player.getName()) - 1);
                            } else {
                                player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "No more flight remaining!");
                                player.setAllowFlight(false);
                               
                                eg.remove(player.getName());
                                Bukkit.getServer().getScheduler().
                            }
                        }
                    }, 20, 20);
                   
                    Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new Runnable() {
                        public void run() {
                            h.remove(player);
                        }
                    }, 20 * 60);
                } else {
                    player.sendMessage(ChatColor.RED + "You are still on cooldown!");
                }
            }
        }
     
  2. Offline

    Rprrr

    lordbobby104
    In the runnable, when you want to cancel it, call this.cancel();.
     
  3. Offline

    lordbobby104

    Rprrr this.cancel() isn't a method!
     
  4. Offline

    Rprrr

    lordbobby104
    I'm sorry, I thought you were using the BukkitRunnable class (I advise you using that class, in my opinion it's way better).
     
  5. Offline

    lordbobby104

    Rprrr Again it isn't allowing me to do this.

    Rprrr If you could give an example of the BukkitRunnable() class you are talking about that woudl be great!

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 5, 2016
  6. Offline

    Rprrr

    lordbobby104
    Sure, here it is.
    Code:
                    new BukkitRunnable() {
                        @Override
                        public void run() {
                            if (someBoolean == true) {
                                //Do some stuff.
                            }
                            else {
                                cancel();
                            }
                        }
                    }.runTaskTimer(plugin, 0L, 20L);    
     
  7. Offline

    lordbobby104

    Rprrr Thanks! hopefully it will work
     
  8. Offline

    the_merciless

    Otherwise, you would do it like this...

    Code:
    package example.example.example;
     
    import org.bukkit.Bukkit;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
     
    public class Yourclass implements Listener{
     
        int task1;
        int task2;
     
        @EventHandler
            public void onPlayerInteract(PlayerInteractEvent e) {
                if(!(e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
                if(e.getPlayer().getItemInHand().getType() == Material.FEATHER) {
                    final Player player = (Player) e.getPlayer();
                    if(!(h.contains(player))) {
                        player.setAllowFlight(true);
                        player.sendMessage(ChatColor.GRAY + "Fly away!");
                        h.add(player);
                        eg.put(player.getName(), 7);
                   
                        task1 = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this.plugin, new Runnable() {
                            public void run() {
                                if(!(eg.get(player.getName()) == 0)) {
                                    player.sendMessage(ChatColor.RED + "" + eg.get(player.getName()) + " seconds of flight remaining!");
                                    eg.put(player.getName(), eg.get(player.getName()) - 1);
                                } else {
                                    player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "No more flight remaining!");
                                    player.setAllowFlight(false);
                               
                                    eg.remove(player.getName());
                                    Bukkit.getServer().getScheduler().
                                }
                            }
                        }, 20, 20);
                   
                        task2 = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this.plugin, new Runnable() {
                            public void run() {
                                h.remove(player);
                            }
                        }, 20 * 60);
                    } else {
                        player.sendMessage(ChatColor.RED + "You are still on cooldown!");
                    }
                }
            }
     
    }
    Then you just use:
    Code:
    Bukkit.getScheduler().cancelTask(task1);
    to cancel a task
     
  9. Offline

    lordbobby104

    the_merciless I used the BukkitRunnable class to do it. I am still getting a nasty error spamming the console. Here is the code and the error:
    Code:
                new BukkitRunnable() {
                    @Override
                    public void run() {
                        if(!(cl.get(player.getName()) == 0)) {
                            cl.put(player.getName(), cl.get(player.getName()) - 1);
                        } else {
                            cl.remove(player.getName());
                            player.sendMessage(ChatColor.RED + "You are now out of combat! You may log out safely!");
                            this.cancel();
                        }
                    }
                }.runTaskTimer(plugin, 20, 20);
    Code:
    2013-11-30 16:59:13 [WARNING] [HGSquad] Task #25 for HGSquad v1.0 generated an exception
    java.lang.NullPointerException
        at me.bobthebuilder.hgsquad.CombatLog$1.run(CombatLog.java:67)
        at org.bukkit.craftbukkit.v1_6_R3.scheduler.CraftTask.run(CraftTask.java:53)
        at org.bukkit.craftbukkit.v1_6_R3.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:345)
        at net.minecraft.server.v1_6_R3.MinecraftServer.t(MinecraftServer.java:524)
        at net.minecraft.server.v1_6_R3.DedicatedServer.t(DedicatedServer.java:227)
        at net.minecraft.server.v1_6_R3.MinecraftServer.s(MinecraftServer.java:488)
        at net.minecraft.server.v1_6_R3.MinecraftServer.run(MinecraftServer.java:421)
        at net.minecraft.server.v1_6_R3.ThreadServerApplication.run(SourceFile:583)
     
  10. Offline

    the_merciless

    line 67 is...?
     
  11. Offline

    lordbobby104

    the_merciless if(!(cl.get(player.getName()) == 0)) {

    the_merciless Any ideas?

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 5, 2016
  12. Offline

    the_merciless

    Code:
        new BukkitRunnable() {
            @Override
            public void run() {
                if (cl.containsKey(p.getName())){
                    if(!(cl.get(player.getName()) == 0)) {
                        cl.put(player.getName(), cl.get(player.getName()) - 1);
                    } else {
                        cl.remove(player.getName());
                        player.sendMessage(ChatColor.RED + "You are now out of combat! You may log out safely!");
                        this.cancel();
                    }
                }else{
                    player.sendMessage(ChatColor.RED + "cl does not contain p.getname()");
                    this.cancel();
                }
            }
        }.runTaskTimer(plugin, 20, 20);
     
  13. Offline

    lordbobby104

    the_merciless It works now! I've just got one question... the runTaskTimer(plugin, 20, 20); should make it occur every second but it seems to be goign faster than that.

    the_merciless I seem to have fixed it! Thanks for your help!

    the_merciless @Rprrr After more testing and adding in a something to say what number it was in chat. I found that it seems to count down about 7 times a second... This shouldn't happen... but just in case you can help me here is my code:

    Code:
                new BukkitRunnable() {
                    @Override
                    public void run() {
                        if(cl.containsKey(player.getName())) {
                            if(!(cl.get(player.getName()) == 0)) {
                                cl.put(player.getName(), cl.get(player.getName()) - 1);
                                Bukkit.getServer().broadcastMessage(cl.get(player.getName()) + "");
                            } else {
                                cl.remove(player.getName());
                                player.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                this.cancel();
                            }
                        } else {
                            this.cancel();
                        }
                    }
                }.runTaskTimer(plugin, 20, 20L);
             
                new BukkitRunnable() {
                    @Override
                    public void run() {
                        if(cl.containsKey(d.getName())) {
                            if(!(cl.get(d.getName()) == 0)) {
                                cl.put(d.getName(), cl.get(d.getName()) - 1);
                            } else {
                                cl.remove(d.getName());
                                d.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                this.cancel();
                            }
                        } else {
                            this.cancel();
                        }
                    }
                }.runTaskTimer(plugin, 20, 20L);
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 5, 2016
  14. Offline

    the_merciless

    Need to see more code, can you show entire class
     
  15. Offline

    lordbobby104

    the_merciless
    Code:
    package me.bobthebuilder.hgsquad;
     
    import java.util.HashMap;
     
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.scheduler.BukkitRunnable;
     
    public class CombatLog implements Listener, CommandExecutor{
        private HashMap<String,Integer> cl = new HashMap<String,Integer>();
        private final Plugin plugin;
     
        public CombatLog(Plugin plugin) {
            this.plugin = plugin;
        }
     
        public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
            Player player = (Player) sender;
            if(commandLabel.equalsIgnoreCase("cl")) {
                if(args.length == 0) {
                    if(player.hasPermission("hg.cl") || player.isOp()) {
                        if(cl.containsKey(player.getName())) {
                            player.sendMessage(ChatColor.GREEN + "You are in combat for " + ChatColor.RED + "" + cl.get(player.getName()) + ChatColor.GREEN + " more seconds!");
                        } else {
                            player.sendMessage(ChatColor.GREEN + "You aren't in combat! You may safely log out!");
                        }
                    } else {
                        player.sendMessage(ChatColor.DARK_PURPLE + "[" + ChatColor.GREEN + "PvPSquad" + ChatColor.DARK_PURPLE + "]" + ChatColor.GOLD + " You don't permission for this command!");
                    }
                } else {
                    player.sendMessage(ChatColor.RED + "Incorrect usage!");
                }
                return true;
            }
            return false;
        }
     
        @EventHandler
        public void onPlayerDamage(EntityDamageByEntityEvent e) {
            if(e.getDamager() instanceof Player && e.getEntity() instanceof Player) {
                final Player d = (Player) e.getDamager();
                final Player player = (Player) e.getEntity();
             
                if(!(cl.containsKey(player.getName()))) {
                    player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "You are now in combat! Don't log out for 30 seconds!");
                    cl.put(player.getName(), 30);
                }
             
                if(!(cl.containsKey(player.getName()))) {
                    d.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "You are now in combat! Don't log out for 30 seconds!");
                    cl.put(d.getName(), 30);
                }
             
                new BukkitRunnable() {
                    @Override
                    public void run() {
                        if(cl.containsKey(player.getName())) {
                            if(!(cl.get(player.getName()) == 0)) {
                                cl.put(player.getName(), cl.get(player.getName()) - 1);
                                Bukkit.getServer().broadcastMessage(cl.get(player.getName()) + "");
                            } else {
                                cl.remove(player.getName());
                                player.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                this.cancel();
                            }
                        } else {
                            this.cancel();
                        }
                    }
                }.runTaskTimer(plugin, 20, 20L);
             
                new BukkitRunnable() {
                    @Override
                    public void run() {
                        if(cl.containsKey(d.getName())) {
                            if(!(cl.get(d.getName()) == 0)) {
                                cl.put(d.getName(), cl.get(d.getName()) - 1);
                            } else {
                                cl.remove(d.getName());
                                d.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                this.cancel();
                            }
                        } else {
                            this.cancel();
                        }
                    }
                }.runTaskTimer(plugin, 20, 20L);
            }
        }
     
        @EventHandler
        public void onPlayerDeath(PlayerDeathEvent e) {
            if(!(e.getEntity() instanceof Player)) return;
            Player player = (Player) e.getEntity();
            if(cl.containsKey(player.getName())) {
                cl.remove(player.getName());
            }
        }
     
        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent e) {
            if(cl.containsKey(e.getPlayer().getName())) {
                Bukkit.getServer().broadcastMessage(ChatColor.RED + "" + ChatColor.BOLD + "" + e.getPlayer().getName() + ChatColor.RESET + "" + ChatColor.RED + " has combat logged to death!" );
                e.getPlayer().setHealth(0.0);
                cl.remove(e.getPlayer().getName());
            }
        }
    }
    
     
  16. Offline

    the_merciless

    Its goint to start a countdown everytime a player is hit, so it will just get faster and faster the more your hurt. Try putiing the tasks inside your 'containsKey' check:

    Code:
        @EventHandler
            public void onPlayerDamage(EntityDamageByEntityEvent e) {
                if(e.getDamager() instanceof Player && e.getEntity() instanceof Player) {
                    final Player d = (Player) e.getDamager();
                    final Player player = (Player) e.getEntity();
               
                    if(!(cl.containsKey(player.getName()))) {
                        player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "You are now in combat! Don't log out for 30 seconds!");
                        cl.put(player.getName(), 30);
                        new BukkitRunnable() {
                            @Override
                            public void run() {
                                if(cl.containsKey(player.getName())) {
                                    if(!(cl.get(player.getName()) == 0)) {
                                        cl.put(player.getName(), cl.get(player.getName()) - 1);
                                        Bukkit.getServer().broadcastMessage(cl.get(player.getName()) + "");
                                    } else {
                                        cl.remove(player.getName());
                                        player.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                        this.cancel();
                                    }
                                } else {
                                    this.cancel();
                                }
                            }
                        }.runTaskTimer(plugin, 20, 20L);
                    }
               
                    if(!(cl.containsKey(player.getName()))) {
                        d.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "You are now in combat! Don't log out for 30 seconds!");
                        cl.put(d.getName(), 30);
                        new BukkitRunnable() {
                            @Override
                            public void run() {
                                if(cl.containsKey(d.getName())) {
                                    if(!(cl.get(d.getName()) == 0)) {
                                        cl.put(d.getName(), cl.get(d.getName()) - 1);
                                    } else {
                                        cl.remove(d.getName());
                                        d.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                        this.cancel();
                                    }
                                } else {
                                    this.cancel();
                                }
                            }
                        }.runTaskTimer(plugin, 20, 20L);
                    }     
                }
            }
    Im assuming you will want to reset the timer to 30 everytime the player is hit, if so use this...

    Code:
        @EventHandler
            public void onPlayerDamage(EntityDamageByEntityEvent e) {
                if(e.getDamager() instanceof Player && e.getEntity() instanceof Player) {
                    final Player d = (Player) e.getDamager();
                    final Player player = (Player) e.getEntity();
               
                    if(!(cl.containsKey(player.getName()))) {
                        player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "You are now in combat! Don't log out for 30 seconds!");
                        cl.put(player.getName(), 30);
                        new BukkitRunnable() {
                            @Override
                            public void run() {
                                if(cl.containsKey(player.getName())) {
                                    if(!(cl.get(player.getName()) == 0)) {
                                        cl.put(player.getName(), cl.get(player.getName()) - 1);
                                        Bukkit.getServer().broadcastMessage(cl.get(player.getName()) + "");
                                    } else {
                                        cl.remove(player.getName());
                                        player.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                        this.cancel();
                                    }
                                } else {
                                    this.cancel();
                                }
                            }
                        }.runTaskTimer(plugin, 20, 20L);
                    }else{
                        cl.put(player.getName(), 30);
                    }
               
                    if(!(cl.containsKey(player.getName()))) {
                        d.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "You are now in combat! Don't log out for 30 seconds!");
                        cl.put(d.getName(), 30);
                        new BukkitRunnable() {
                            @Override
                            public void run() {
                                if(cl.containsKey(d.getName())) {
                                    if(!(cl.get(d.getName()) == 0)) {
                                        cl.put(d.getName(), cl.get(d.getName()) - 1);
                                    } else {
                                        cl.remove(d.getName());
                                        d.sendMessage(ChatColor.GREEN + "You are now out of combat! You may log out safely!");
                                        this.cancel();
                                    }
                                } else {
                                    this.cancel();
                                }
                            }
                        }.runTaskTimer(plugin, 20, 20L);
                    }else{
                        cl.put(d.getName(), 30);
                    }
                }
            }
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 5, 2016
  17. Offline

    lordbobby104

    the_merciless Well now it actually works! Thanks again for all your help!
     
Thread Status:
Not open for further replies.

Share This Page