2016-06-21 12 views
0

私は真剣な助けが必要です。ForループでBukkitタスクが完了するまで待つ

ここに私のコードがあります。

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; 

これは、実行するコマンドとそれぞれの間に遅延がある設定から文字列リストを取得することです。私は第2の設定のためのコマンドを実行すると はここで、

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

その部分の設定です。問題は、最初のコマンドが実行されるのを待ってから、forループ内の2番目のコマンドラインに移ることではないということです。メインスレッドを凍らせずに最初のコマンドを待つようにするにはどうすればいいですか?実行可能ファイルの重要なセクションは次のとおりです。

public consoleExecuteTask(CommandStrings plugin, String command) { 
    this.plugin = plugin; 
    this.command = command; 
    plugin.getLogger().info("called"); 
    running = true; 
} 

public void run() { 
    plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(),command); 
    running = false; 
    plugin.getLogger().info("ran " + command); 
} 

私はこの方法でタスクを取得しています。

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

答えて

1

あなたはスケジューラを使用する必要があります。スケジューラを作成するには

、新しいBukkitRunnableを作成する必要があり、それを実行します。

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

http://wiki.bukkit.org/Scheduler_Programming

+0

それでは、どのよう私も実行可能にコマンドのすべてを取得するのでしょうか? forループを新しい実行可能ファイルに移動するだけですか?また、問題は、コードの他の半分ではコマンド間の遅延が異なるため、遅延の異なるループを実行するたびに実行可能ファイルを作成する必要があることです。 –

関連する問題