cancel task doesn't work

Discussion in 'Plugin Development' started by creppii, Jul 29, 2014.

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

    creppii

    hey guys,

    if i want to cancel a task, it doesnt work! this is my code:

    Code:
    if(spawn.containsKey(p.getName())) {
                if(!(loc1.getBlockX() == loc2.getBlockX() && loc1.getBlockZ() == loc2.getBlockZ())) {
                    spawn.remove(p.getName());
                    p.sendMessage("§7Die Teleportation wurde unterbrochen!");
                    //how to do this -> Bukkit.getServer().getScheduler().cancelTask(this.spawnTask);
                }
            }
     
     
    Player p = (Player)sender;   
            //Spawn Befehle
            if(cmd.getName().equalsIgnoreCase("spawn")) {
                p.sendMessage("§6Teleportiere zum Spawn in 5 Sekunden, nicht bewegen...");
                spawn.put(p.getName(), p.getLocation());
                int spawnTask = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
                    @Override
                    public void run() {
                        if(spawn.containsKey(p.getName())) {
                            p.teleport(p.getWorld().getSpawnLocation());
                            p.sendMessage("§6Du wurdest zum Spawn teleportiert!");
                        }
                    }
                }, 20L*5);
            }

    if a player moves, it should cancel the task, but it cant find the task :/

    thx for help

    i found a solution -> Bukkit.getServer().getScheduler().cancelTasks(plugin);

    but i dont know if that cancel all tasks from my plugin, or just the ones from my class? can some1 say that

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

    GameplayJDK

    creppii int spawnTask has to be global. But you don't really need to cancel it, because it only teleports theplayer if his name is contained in the list. And since you're removing the player from that list, he wont be teleported after moving
     
  3. Offline

    creppii

    GameplayJDK das geht nicht, weil wenn er /spawn eingibt und danach läuft, wird er aus der hasmap geschmissen. Soweit so gut, aber wenn er danach nochmals /spawn eingibt, wird er ja wieder in die hasmap eingetragen und somit könnte es sein dass er direkt nach einer sekunde teleportiert wird, wenn der Scheduler noch läuft!

    Beispiel:
    Der Spieler gibt /spawn ein. Der Scheduler läuft runter bis zu 3 Sekunden, danach bewegt er sich. Somit wird er aus der Hashmap geworfen. Der Scheduler läuft weiter. Nun gibt er nochmals /spawn ein, wenn der Countdown bei 1 Sekunde ist und da der Scheduler jetzt testet, ob er in der Hashmap ist, wird er sofort teleportiert!

    Und das mit global funkzt ned :/ Wenn ich public int spawnTask mache, gibts nen fehler

    danke für die hilfe
     
  4. Offline

    GameplayJDK

    creppii Dann ist das möglicherweise nicht anders möglich, als mit einer anderen HashMap<String, Integer> in der der spielername und die ID des scheduled tasks gespeichert wird.
    Beim command dann playershedulers.put(p.getName(), Bukkit.getScheduler().etc) und beim listener if (playershedulers.containsKey(p.getName())) { Bukkit.getServer().getScheduler.caneltask(playerschedulers.get(p.getName())) usw. }
     
  5. Offline

    creppii

    GameplayJDK ist es dann nicht möglich, mit folgendem Code den Task zu beenden?
    Code:
    Bukkit.getServer().getScheduler().cancelTasks(plugin);
    Da werden doch nur alle Scheduler von der aktuellen Klasse removet. Das wäre gut, denn ich habe nur einen Scheduler in dieser Klasse
     
  6. Offline

    GameplayJDK

    creppii Möglich.. Ich hab .cancelTasks(plugin) noch nie benutzt
     
Thread Status:
Not open for further replies.

Share This Page