我需要一些认真的帮助。
这是我现在的代码。
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;
}
答案 0 :(得分:1)
您需要使用计划程序。
要创建调度程序,您需要创建一个新的BukkitRunnable,然后运行它:
new BukkitRunnable() {
@Override
public void run() {
// Execute the commands here one by one.
}
}.runTaskTimer(mainInstance, 0, delayBetweenCalls);