2016-06-21 13 views
0

Ich brauche einige ernsthafte Hilfe.Warten auf eine Bukkit Aufgabe in einer For-Schleife

Hier ist mein Code jetzt.

for (String line : commandStrings) { 
    line = line.trim(); 
    line = line.replaceAll("\\{PLAYERNAME\\}", target.getName()); 
    util.log(line); 
    char[] lineArray = line.toCharArray(); 
    if (lineArray.length > 1) { 
     if (lineArray[0] == '/') { 
      String command = util.removeElt(lineArray, 0); 
      util.log(command); 
      if (!(config.getBoolean("Command Strings." + args[2] + ".delay.firstExecuteDelay")) && count == 0) { 
       consoleExecuteTask = getTask(command); 
       BukkitTask task = scheduler.runTask(this.plugin, consoleExecuteTask); 
       continue; 
      } else { 
       consoleExecuteTask = getTask(command); 
       BukkitTask task = scheduler.runTaskLater(this.plugin, consoleExecuteTask, (delay * 20L)); 
       util.log("ran later"); 
       continue; 
      } 
     } else { 
      util.log("Invalid Command : \" " + String.valueOf(lineArray) + " \" in Command String: " + args[2]); 
      continue; 
     } 
    } else { 
     continue; 
    } 

} 
sender.sendMessage(prefix + ChatColor.GREEN + "Command String : " + args[2] + "Executed."); 
return true; 

Was es tun soll, ist eine String-Liste mit Befehlen aus der Config erhalten laufen und zu einer Verzögerung zwischen jedem von ihnen. Hier ist die Konfiguration für den Teil,

preset2: 
    delay: 
    global_delay: true 
    global_delayString: "10s" 
    firstExecuteDelay: true 
    commands: 
    - "/effect {PLAYERNAME} speed 30 5" 
    - "/effect {PLAYERNAME} 16 30 5" 

Wenn ich den Befehl für den zweiten voreingestellten laufen. Das Problem ist, dass es nicht darauf wartet, dass der erste Befehl ausgeführt wird, bevor es zum zweiten commnand in der for-Schleife weitergeht. Wie kann ich darauf warten, dass der erste Befehl ausgeführt wird, ohne den Haupt-Thread einzufrieren? Hier ist der wichtige Abschnitt des Runnable:

Ich bin mit dieser Methode, um die Aufgabe zu bekommen.

public static consoleExecuteTask getTask(String line) { 
    if (consoleExecuteTask == null) { 
     consoleExecuteTask = new consoleExecuteTask(plugin, line); 
    } 
    return consoleExecuteTask; 
} 

Antwort

1

Sie benötigen einen Scheduler zu verwenden.

einen Scheduler zu erstellen, müssen Sie eine neue BukkitRunnable erstellen, führen Sie es dann:

new BukkitRunnable() { 
    @Override 
    public void run() { 
     // Execute the commands here one by one. 
    } 
}.runTaskTimer(mainInstance, 0, delayBetweenCalls); 

http://wiki.bukkit.org/Scheduler_Programming

+0

Wie würde ich aber alle Befehle in die runnable bekommen? Würde ich einfach die for-Schleife in das neue runnable verschieben? Auch das Problem ist, dass für die andere Hälfte des Codes die Verzögerung zwischen den Befehlen variiert, so muss ich jedes Mal, wenn ich die Schleife mit den verschiedenen Verzögerungen durchlaufe, ein ausführbares Programm erstellen. –