等待Bukkit任务在For循环中完成

时间:2016-06-21 20:43:11

标签: java scheduler minecraft 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;

它应该做什么,是从配置中获取一个String列表,其中包含要运行的命令以及每个命令之间的延迟。 这是该部分的配置,

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

当我运行第二个预设的命令时。问题是它不会等待第一个命令在进入for循环中的第二个commnand之前执行。如何让它等待第一个命令完成而不冻结主线程。以下是runnable的重要部分:

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 个答案:

答案 0 :(得分: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